# 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
}
SERPENTINE PATH (usa) - Emanations (2014)

Label : Relapse Records
Sortie du Scud : 27 mai 2014
Pays : Etats-Unis
Genre : Doom / Death Metal
Type : Album
Playtime : 7 Titres - 45 Mins
Canalisations bouchées ? Fosse sceptique engorgée ? Fosse à purin débordante ? Miasmes ? Surtout, n'agissez pas. Et respirez ces émanations, profondément, jusqu'à en vomir. Ça ne pourra qu'être un bouquet au nez complexe comparé à Emanations, le second effort des crassseux-pouilleux-dégueulasses de SERPENTINE PATH. J'ai appris à connaître ces garçons en 2012, du temps de leur premier album éponyme. Une ode au flegme rythmique si intense qu'on n'a surement pas connu ligne plus droite sur un électroencéphalogramme depuis la mort cérébrale de SAINT VITUS. Autant dire que mon coeur palpitant a vite été écœuré à l'annonce de leur grand retour. Je n'ai pas les paupières lourdes. Je n'ai pas sommeil. Mais je sens que ça va vite venir. Et c'est finalement ça qui fait le charme ultime de SERPENTINE PATH ; cette capacité à te plonger dans un état de latence orgasmique en chiant un riff de clodo par seconde. L'Homme aime la décadence, comme un retour à la période bénite où il s'en mettait plein les couches en rigolant. Emanations va le servir comme il se doit, dans la plus pure tradition du Doom / Death odorant.
Rétrograde, primitif, dégoulinant de saindoux, puant l'urine, la reubié et le tarpé, cet album perpétue la looooooongue marche en avant de SERPENTINE PATH, et reprend avec "Essence Of Heresy" l'héritage d'"Only A Monolith Remains". Tempo étouffant, riffs écrasants, râles lancinants balancés par le tintement régulier des cymbales, ça ressemble presque à du ROTE MARE sous perfusion. L'idée, c'est qu'on devra se contenter de ça, et uniquement de ça, durant trois gros quarts d'heure. Respectant scrupuleusement les séquences rythmiques propres au Doom en y ajoutant sa touche de modernité décadente (car oui, désormais, le kitsch c'est tendance), le quintet parvient rapidement à trouver son équilibre, mettant à profit tout le temps dont il dispose pour ambiancer son album. D'une ruelle fumante new-yorkaise à une cave sordide jonchée d'organes bruns-verts, SERPENTINE PATH nous fait pénétrer dans son théâtre des horreurs, toujours en arborant ce diabolique sourire propre au Sludge malintentionné. C'est une constante, appuyée sur "House Of Worship", moins présente sur "Treacherous Waters". Et pour cause, cette dernière a tant de sensibilité à véhiculer qu'on en oublie sa technique aléatoire, sa longueur rédhibitoire. Plus torturé que Serpentine Path mais néanmoins plus chaleureux, plus heavy ("Torment"), Emanations est clairement un cran au-dessus de son prédécesseur. Logique ? Pas tant que ça. Il fallait bien un tube-déchet de la trempe de "Claws" pour parvenir à cette performance, et pas sûr qu'en pratiquant un style dont la légende dit de lui qu'il est rébarbatif, on arrive à un pareil renouvellement. Tantôt dans la vibe old-school d'un PENTAGRAM, tantôt dans l'hypnose à la ELECTRIC WIZARD, SERPENTINE PATH évoque, suggère, rappelle et engourdit l'auditeur dans une nébuleuse malsaine de psychédélisme sans lui dire s'il a affaire à un groupe de Death vide d'énergie ou à un groupe de Doom visionnaire. Emanations est la boite de Pandore, à moins qu'il ne s'agisse que d'une banale benne à ordure ?
Mais en quoi est-ce vraiment important ? J'aimerais pouvoir me pisser dessus quand j'ai la flemme d'aller aux toilettes. J'aimerais me rouler dans la boue sans passer pour un marginal. Le bonheur, c'est que SERPENTINE PATH propose au commun des mortels, au type le plus banal qui existe, d'accéder à cette décadence, de devenir un véritable déchet humain, le tout en musique, et en surpassant de très loin son premier album.
Et croyez-moi, on s'accommode étonnamment vite aux mouches à merde qui gravitent autour d'Emanations.
Ajouté : Lundi 10 Août 2015 Chroniqueur : Stef. Score :     Lien en relation: Serpentine Path Website Hits: 6794
|