# 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
}
MEMORIES OF A DEAD MAN (FRA) - Ashes Of Joy (2014)
Label : Send The Wood Music
Sortie du Scud : 14 avril 2014
Pays : France
Genre : Post-Hardcore
Type : Album
Playtime : 11 Titres - 57 Mins
Sous l'immaculé, le miasme. Ashes Of Joy, c'est le cadavre dans le placard. Rien ne me plait dans cet album... Je n'ai pas envie d'en ouvrir les portes. Aucun besoin de savoir à qui appartient le corps, pas même l'ombre d'une curiosité morbide. Et ce depuis V.I.T.R.I.O.L. en 2012, un second album abrasif qui m'a profondément convaincu de la barbarie musicale des franciliens de MEMORIES OF A DEAD MAN. Pourtant, que d'attrait pour la putréfaction, que d'hypnotisme face à la masse grouillante d'asticots. On résistera, mais pas longtemps. L'espace d'un instant, histoire d'enclencher un ersatz de préparation mentale, puis on cède. Ashes Of Joy, c'est plus fort que tout, mais pas tant que ça. Synthèse organique de Rock, Hardcore et Metal, brodé de différents fils, à analyser sous différentes coutures, il est l'album extrême du temps présent, symptôme d'une plongée dans les abysses d'un marasme cérébral dont on ressurgit forcément un peu chamboulé.
Les murs vibrent, la terre tremble. La résonnance dont fait preuve "Melancholia" est ce genre de séisme dont on raffole. Epique, torturée, soupe-au-lait, cette composition fait du MEMORIES OF A DEAD MAN 3.0 un repère d'aliénés. Les nerfs à vif, le groupe fait parler ses pulsions via un Post-Hardcore pachydermique nimbé de Sludge baignant dans un Rock atmosphérique lancinant ("Touched With Pensiveness" en est un amalgame saisissant) avant de croquer de l'Excedrin pour faire passer sa migraine. Le corps s'engourdit alors d'une sensation lénifiante qui le projette dans un état second en cas d'abus, et c'est exactement ce qui arrive sur cet album, quand "Wounded Knee" s'achève avec tranquillité, quand "La Nausée" passe à force d'anesthésie rythmique, quand "The Swan's March" nous enveloppe de sa chaleur vocale et de son confort technique. Ashes Of Joy devient parfois un cocon que Pierre Duneau se fait un plaisir de démolir, de sa voix rocailleuse et massive que nous permet d'apprécier le débit très lent des paroles. Musicalement parlant, il est incontestable que MEMORIES OF A DEAD MAN, au bout de trois albums, a trouvé son identité et qu'il ne s'agit plus d'une créature hybride à mi-chemin entre NEUROSIS, TOOL, CULT OF LUNA, MASTODON (et j'en oublie tellement). Néanmoins, les franciliens n'échappent pas tout à fait à leur passé et évoluent parfois sur un faux rythme ("The Fall Of Dog : Maelstrom Involution") qui pénalise la fluidité très relative de l'opus. La corde sensible qui relie les compositions se fait épisodiquement asticoter par une façon d'écrire et de jouer loin des conventions terrestres, ce qui, j'en conviens, est le credo absolu de MEMORIES OF A DEAD MAN et du fantasque Ben Debrun, compositeur inspiré s'il en est. Mais, car il y a un mais, Ashes Of Joy n'en ressort pas toujours bénéficiaire, souffrant notamment de son jusqu'au-boutisme assumé dont il est difficile de se laisser imbiber entièrement. On est obligé de se freiner, de peur de basculer dans un univers que ni eux ni nous ne contrôleraient.
L'excentricité de cette œuvre, sa noirceur, sa candeur trompeuse, sa décadence orchestrée en font une sortie particulièrement remarquable, toute de calme et de tempête rythmée. Un caractère fort qui ceint une sensibilité à fleur de peau, voilà de quoi MEMORIES OF A DEAD MAN joue surAshes Of Joy, qui répond parfaitement aux exigences de ce microcosme Post-que-sais-je, pas toujours identifiable mais délicieusement régressif. Rien ne me plait dans cet album. Je maintiens. Car je sens qu'il cherche à aller au plus profond de moi... comme de nous tous.
Ajouté : Jeudi 06 Août 2015 Chroniqueur : Stef. Score : Lien en relation: Memories Of A Dead Man Website Hits: 4608
|