# Copyright (C) 2002-2004 gregoire HUBERT.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Author : gregoire HUBERT
#
# XML_node.objet
#
# This object is an XML node representation
#
# /- name (string)
# xml_node --- attributes (array)
# \- children (array) or value (string)
class xml_node {
var $name;
var $attributes = array();
var $children = array();
var $value = "";
function xml_node($name,$attributes,$children=array(),$value="") {
$this->name = $name;
if (is_array($attributes)) {
$this->attributes = $attributes;
}
$this->children = $children;
$this->value = $value;
}
}
# Copyright (C) 2003-2004 gregoire HUBERT.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Author : gregoire HUBERT
#
# xml_tree class
#
# This object parses an XML stream and offers a tree composed by xml_nodes
#
class xml_tree {
var $xml_stream;
var $current_node;
var $root_node;
var $index;
var $value;
function xml_tree() {
$this->root_node = new xml_node("__ROOT_NODE",array());
$this->current_node = $this->root_node;
}
function add_tree($xml_stream) {
# Managing the parser
$this->xml_stream = $xml_stream;
$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser,XML_OPTION_CASE_FOLDING,0);
xml_parser_set_option($xml_parser,XML_OPTION_SKIP_WHITE,1);
if (!xml_parse_into_struct($xml_parser,$this->xml_stream,$this->value,$this->index)) {
xml_parser_free($xml_parser);
die("XML Parse error");
}
xml_parser_free($xml_parser);
# Now, $this->value and $this->index are informed, we can use the get_node methode.
$tab_result = $this->get_node(0,count($this->value) - 1);
$this->root_node->children[] = $tab_result[0];
$this->current_node = $this->root_node;
}
function get_node($index_start,$index_stop) {
#echo " \n";
#echo "GET-NODE($index_start,$index_stop) \n";
# What we are going to return is an array of xml_nodes
$return_tab = array();
# depth is only here to check if everything is all right
$tab_node = $this->value[$index_start];
$depth = $tab_node["level"]-1;
# Now we have to be sure we do not forget a single node
for ($index = $index_start;$index <= $index_stop;$index++) {
#echo "\$index = $index ";
# get the current node
$tab_node = $this->value[$index];
# what type of node is it ?
switch($tab_node["type"]) {
case "complete" :
# Depth integrity check
if ($tab_node["level"] != $depth+1) {
die("ERREUR # contrainte d'intégrité au noeud complet $index, niveau $depth + 1 au lieu de ".$tab_node["level"]);
}
#echo "Noeud complet trouvé position $index TAG ".$tab_node["tag"]." \n";
# Easy one, no children to manage, only a value...
$return_tab[] = new xml_node($tab_node["tag"],$tab_node["attributes"],"",$tab_node["value"]);
break;
case "open" :
# Depth integrity check
if ($tab_node["level"] != $depth +1 ) {
die("ERREUR # contrainte d'intégrité au noeud ouvert $index, niveau $depth au lieu de ".$tab_node["level"]);
}
# Open tag, we re-use this methode to return its children
# Where is the correspondong close tag ?
$node_index = $this->index[$tab_node["tag"]];
$flipped_node_index = array_flip($node_index);
#echo "This ".$tab_node["tag"]." is at coords ".$flipped_node_index[$index]." ";
$i=1;
do {
$next_index = $node_index[$flipped_node_index[$index] + $i++];
$next_tag=$this->value[$next_index];
}
while ($next_tag["level"]!=$tab_node["level"]);
#echo "Ouverture de noeud détectée pos $index TAG ".$tab_node["tag"]." \n Parcours jusqu au $next_index \n";
# good, we can now instanciate our node
$return_tab[] = new xml_node($tab_node["tag"],$tab_node["attributes"],$this->get_node($index+1,$next_index),"");
# As we called the get_node methode, we are sure that nodes have been parsed to the corresponding close tag
$index = $next_index;
break;
case "close" :
# Depth integrity check
if ($tab_node["level"] != $depth ){
die("ERREUR # contrainte d'intégrité au noeud fermé $index, niveau $depth au lieu de ".$tab_node["level"]);
}
#echo "Fermeture de noeud detectée pos $index TAG ".$tab_node["tag"]."
\n";
# This ugly thing is useless because reaching a close tag means that $index==$index_stop but who knows ? =)
# it will be skipped soon
$index = $index_stop;
break;
default:
die("Erreur de type de TAG non déterminé :'".$tab_node["type"]."'");
}
}
# We are out ... returns the array with collected children...
return ($return_tab);
}
# this function browse the xml tree and set the current node to the selected node
function give_node($path) {
if ($path[0]=="/") {
$current_node=$this->root_node;
$path=substr($path,1);
#echo "ABSOLUTE PATH GIVEN=$path ";
}
else {
$current_node = $this->current_node;
}
#echo "PATH GIVEN=$path ";
$tab_path = split("/",$path);
foreach ($tab_path as $node_expr) {
#echo "STUDYING EXPR='$node_expr' ";
$node = $current_node;
$expr_tab = split("\?",$node_expr);
$node_name = $expr_tab[0];
$attr_tab = 0;
if (count($expr_tab)>1) {
##echo "TROUVE AU MOINS UNE CONDITION SUR LES ATTRIBUTS... ";
$attr_expr_tab=split(",",$expr_tab[1]);
$attr_tab=array();
foreach($attr_expr_tab as $attr_expr) {
$attr_split_expr=split("=",$attr_expr);
$attr_tab[$attr_split_expr[0]]=$attr_split_expr[1];
}
}
$last=0;
foreach ($node->children as $children) {
#echo "COMPARING WITH '$children->name' ";
if ($children->name == $node_name) {
##echo "TROUVE NOEUD CORRESPONDANT $node_name ";
if (is_array($attr_tab)) {
$node_attributes = $children->attributes;
foreach ($attr_tab as $key=>$value) {
if ($node_attributes[$key] == $value) {
#echo "ATTRIBUTE & CHANGE CURRENT NODE TO ".$children->name." ";
$current_node = $children;
$last = 1;
}
}
}
else {
##echo "CHILD=".$children->name." ";
#echo "CHANGE CURRENT NODE TO ".$children->name." ";
$current_node = $children;
$last=1;
}
}
if ($last) {
break;
}
}
if (!$last) {
#echo "PATH ERROR $node_name ";
#die("MMmmmh It seems that this file is not a DIA XML format...sorry...");
return 0;
}
}
return $current_node;
}
function browse_tree($path) {
$node = $this->give_node($path);
if (is_object($node)) {
$this->current_node = $node;
return 1;
}
return 0;
}
# this method dumps an html representation of the xml tree
function xml_show($node = "",$level=0,$last=0) {
if ($node=="") {
$node=$this->root_node;
}
if (!is_object($node)) {
die("ERROR : node is not an object");
}
$line="";
for($i=1;$i<=$level;$i++) {
if ((i==$level-1) and ($last)) {
$line.=" ";
}
else {
$line.=" |";
}
if ($i==$level) {
$line.="`-";
}
}
$line.=$node->name;
#echo $line;
$line.="".count($node->children)."";
if (count($node->children)==1) {
$line.=" (".$node->value.") \n";
echo "$line";
}
else {
$line.=" \n";
echo "$line";
$i=1;
foreach($node->children as $children) {
if ($i==count($node->children)) {
$this->xml_show($children,$level+1,1);
}
else {
$this->xml_show($children,$level+1);
}
$i++;
}
}
}
#END_CLASS
}
WINTEREVE (FRA) - Première Danse Macabre (2014)
Label : Auto-Production
Sortie du Scud : février 2014
Pays : France
Genre : Doom / Death mélodique
Type : Demo
Playtime : 6 Titres - 26 Mins
Il y a des débuts qui ressemblent à des fins, et ceux-ci en sont.
Première Danse et Dernière Homélie. Les deux sont macabres et finalement, ce n'est surement qu'un au revoir.
Alors que WINTEREVE, n'ayant rien demandé à personne, nous salue bien profond avec sa première démo, c'est pour ma part la dernière. La dernière ou presque, avant que l'appel du verbe ne se fasse plus pressant et que je ne reparte contre mon gré pour quelques ébauches littéraires, quelques 1124 chroniques pour Metal-Impact plus loin.
Et pourtant, ça n'a rien d'un sevrage. Pas encore. La faute à ce groupe lorrain, qui m'a offert un ultime tour de piste plus que jouissif. Formé dans la région du Grand Nancy début 2013, WINTEREVE est le résultat sombre et mystique d'une rencontre. Celle de Mary (ex-EDENFALL) et de Luggh (ex-CLAIR OBSCUR), respectivement vocaliste et guitariste, qui interagissent ensemble sur de longues litanies Death / Doom matinées de Dark et de Gothic. Récemment rejoint par Carl (batterie), Sébastien (basse) et Didier (deuxième guitare), le duo (qui n'en est donc plus un) aspire désormais à mieux, fort de cette Première Danse Macabre aussi langoureuse que mortifère.
Pour commencer, mes premiers sentiments iront à l'esthétisme sobre et glacial du disque, livré dans un digipack perfectible (flou sur les photos, mauvais centrages...) mais parfaitement équilibré avec les tons noirs et gris de la musique de WINTEREVE. C'est comme si on devinait les larmes de sang couler en silence derrière la main figée de cette madone. Troublant. Le vent se lève soudain avec l'avènement de "From The Depths Of Sorrow", une introduction orchestrale de trois minutes qui forge d'emblée une ambiance quasi dramatique à la démo, principalement grâce aux vocalises de Mary, que l'on découvre très à son avantage dans ce registre, même si la production artisanale se chargera un peu plus loin de rompre le charme. Une voix bourrue surgit alors de derrière un riff mélodique, et la Première Danse Macabre s'embrase dans un tango lent où la séduction est l'objectif. Via ce premier titre intense, ciselé, entre Death classique (1'21), Doom mélodique (2'39) et lyrisme, WINTEREVE cherche incontestablement le contact avec l'auditeur. Et ça marche. Progressivement (à force de réécoutes surtout), les lorrains captent l'attention, en dépit comme je le soulignais plus haut d'une production vraiment rustique qui dessert principalement le chant Death de Mary (oui, c'est bien elle qui alterne chant lyrique et growls) et ses envolées sur la deuxième partie de "Forever Bleeding Sears". La justesse est là, mais ne réglez pas le volume trop haut au risque de faire exploser les vitres. Par contre, aucun souci pour "Shattered Illusions", surement le meilleur titre de la démo avec ses frises mélodiques poignantes et ses leads tranquilles. Citant Alfred De Musset en début de piste, WINTEREVE en profite pour faire en musique l'éloge d'une sinistre poésie, et ça lui sied parfaitement. Son seul défaut est finalement d'avoir voulu avancer trop rapidement, car avec trois membres (dont deux instrumentistes, Luggh et Carl), le groupe n'a pas mis de son côté toutes les chances de donner une véritable profondeur sonore à son Death / Doom, trop décharné par moments, même si les timides arrangements de "Obscure Beliefs" rattraperont un final plus figue que raisin. J'ai hâte de réécouter ce projet avec un line-up solidement ficelé et un véritable éventail de possibilités techniques. Seuls ces détails feront de WINTEREVE un groupe encore plus complet musicalement qu'il ne l'a déjà été sur cette très bonne première démo.
L'heure n'est toutefois pas à l'emballement. Si les lorrains disposent à la fois d'une âme musicale prononcée (ce qui n'est pas donné à tout le monde après un an d'existence) et d'un capital sympathie honnête, les coups de cravache devront être un peu plus saignants, et l'ambiance plus glauque encore, pour qu'un esprit malin vienne hanter un cimetière jusqu'ici jonché de souvenirs. Mais dans le regard de WINTEREVE, il y a de la beauté. Cette beauté morbide qui vous ferait entamer un slow avec un cadavre, et qui vous ferait trouver ça exquis. Alors, pour la dernière fois, voulez-vous danser avec moi ?
Ajouté : Lundi 10 Août 2015 Chroniqueur : Stef. Score : Lien en relation: Wintereve Website Hits: 5546
|