# 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
}
SERPENTIA (pl) - Dark Fields Of Pain (2003)
Label : Metal Mind Records
Sortie du Scud : 26 mai 2003
Pays : Pologne
Genre : Death Metal
Type : Album
Playtime : 9 Titres - 42 Mins
Une fois n'est pas coutume, je vous propose un brin de poésie à la polonaise. Colmatant les brèches, soudant les jointures avec autant de dextérité qu'un plombier, SERPENTIA, qui affiche ses affinités avec quelques bons clients des années 2000 (ANAL STENCH, ATROPHIA RED SUN, DECAPITATED, THY DISEASE, SCEPTIC, SCUMBAG, CEMETERY OF SCREAM), a fait du Death Metal sa spécialité. Jusqu'ici, rien de nouveau sous le zénith. D'ailleurs, pour être tout à fait précis, à aucun moment ce quatuor ne se permettra le moindre rejet ostensible de ses origines rouges et blanches. Ayant évolué depuis ce premier album nommé Dark Fields Of Pain (2003) vers un Death plus mélodique fièrement matérialisé par l'album The Day In The Year Of Candles en 2011, SERPENTIA a débuté sa carrière de façon relativement obscure, comme en atteste la pochette peu engageante de ce full-lenght. Entre la corde et la lame, on préférerait presque cet opus pour en finir correctement.
Correct. C'est l'adjectif qui sied le mieux à cette œuvre. On saura très vite à quoi s'en tenir, et même si le deuxième, troisième et quatrième chapitres de ce manifeste sont trompeurs, l'état d'esprit général qui régit Dark Fields Of Pain n'est pas à remettre en cause. Dans son vêtement Death Metal guttural un peu trop moulant, "The Worst Enemy" est une ouverture sans folie, bien que vainement nuancée d'un trait de Black Metal. SERPENTIA dénude son corps inharmonieux et quelconque avec une pointe de hardiesse qui a quelque chose de ridicule. Par contre, comme je le soulignais plus haut, c'est loin d'être le même topo pour "Consciousness Of The Beyond", l'instrumentale "Hospice Of Hope" et surtout, "Waiting For Wings". Au-delà d'un surprenant chant clair lové dans d'agréables arpèges acoustiques, ce titre ressemble à s'y méprendre à un véritable temps fort lorgnant vers le Death mélodique qui deviendra quelques années plus tard l'âme musicale du groupe. Un titre inspiré qui doit cependant se sentir bien seul au milieu de ce défouloir grandeur nature. Car sous couvert parfois d'expérimentations rythmiques, d'arrangements psychédéliques, de nuances prog/symphoniques, ce Death Metal ne casse pas des briques. Les séquences d'ultra-violence, blasts hasardeux en chef de gare, ne laissent pas un souvenir impérissable et c'est tout le problème d'un disque qui tente d'innover sans vraiment y parvenir. SERPENTIA, sur un titre comme "Extraterrestial Mother", ne semble pas savoir sur quel pied danser. Leur Death est moyen, leur façon d'improviser est moyenne et l'un dans l'autre, c'est franchement anecdotique. D'autant plus anecdotique que la production manque de rondeur. Les growls gagnent en coffre au détriment de la batterie, totalement étouffée par l'intensité mélodique qu'a voulu mettre en avant le groupe. Sauf que SERPENTIA ne jouait pas encore de Death mélodique à l'époque et que par conséquent, Dark Fields Of Pain erre comme une âme ronchonne dans une pièce où ils sont 25 à se partager le mètre carré.
Ceci étant, je persiste et je signe : ce premier effort est correct. Mais comme toujours, passé l'émerveillement niais de la découverte, passée l'envie d'en savoir plus sur SERPENTIA, on finira par s'en remettre à des valeurs un peu plus sûres, qui ont fait leur réputation dans un registre où le mot "compromis" est à bannir. Il y en a tellement en Pologne qu'on ne trouvera aucune autre bonne excuse à Dark Fields Of Pain, si ce n'est d'avoir été intense à quelques trop rares reprises.
Ajouté : Vendredi 07 Août 2015 Chroniqueur : Stef. Score : Lien en relation: Serpentia Website Hits: 5522
|