# 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
}
THIS ENDING (se) - Dead Harvest (2009)
Label : Metal Blade Records / Season Of Mist
Sortie du Scud : 2 février 2009
Pays : Suède
Genre : Fake / Death Metal mélodique
Type : Album
Playtime : 10 Titres - 45 Mins
Définitivement conquis par un premier album (Inside The Machine) qui avait marqué non pas la naissance de THIS ENDING mais plutôt la résurrection d’A CANOROUS QUINTET, une vieille formation de Death mélodique old-school suédoise sournoisement écartée en plein règne par des groupes peu scrupuleux (IN FLAMES, DARK TRANQUILITY, HYPOCRISY…), je n’attendais pas moins de ce Dead Harvest qu’un mythe qui rétablirait la vérité sur l’immense potentiel entrevu chez les suédois il y’a déjà plus de dix ans de cela. En vérité, je vais devoir revoir mes intentions à la baisse puisque cette deuxième sortie des stockholmois est un rien décevante par rapport aux espoirs placés en elle.
Ces trois années de sevrage ont visiblement été vaines. La production signée chez le prestigieux Metal Blade n’apporte rien de bien nouveau. Les idées d’Inside The Machine sont reprises, peaufinées, retravaillées, exploitées, creusées mais rarement améliorées. Il y’avait pourtant beaucoup de petites choses à reprendre comme ce paradoxe de faire un disque de Death mélodique avec des solos qui se contaient sur les doigts d’une main. Ici, ils se content sur les doigts de deux mains. Pourtant, oh grand pourtant, jamais Dead Harvest ne fait un pas de travers. Pas une composition ne pourra être qualifiée d’irréfléchie ou de même de nulle (pour ceux qui peinent à argumenter). C’est peut-être ce manque d’ambition mêlé à une flemmardise à peine dissimulée qui gêne. Pendant que certains se saignent aux quatre veines pour innover, nos amis du grand Nord s’essayent au recyclage. On remarquera quand même que la majeure partie des chansons s’articule autour d’un axe couplet-solo-refrain pas détestable et mes aïeux, bien imaginé. Pas novateur pour un kopek, THIS ENDING compense avec des mélodies imparables et surtout, attrapes-couillon. Moi aussi, comme un couillon, j’ai fondu devant la supposée pureté du titre éponyme dont le motif aérien m’est resté scotché aux tympans de longues minutes ou le tempo sec comme une biscotte lyophilisée de « Tools Of Demise ». Sur le coup, on serait presque tentés de trouver la recette finalement pas si mauvaise. Errare humanum est. Dead Harvest est cent fois plus vicieux qu’il n’y parait. Si ça ne se ressent pas forcément au premier abord, à tête reposée, c’est une autre paire de manche : comment peut-on faire quelque chose d’aussi pédant, consensuel et taillé dans la mode sans avoir en ligne de mire les ronds de cuir précieux à Francis Lalanne ? Le voilà le problème : les suédois ont été programmés. Pire, ce disque à été programmé. Programmé pour plaire et effectivement, aucune profusion d’un quelconque sentiment, d’une quelconque sincérité n’est décelable. Leurs corps pourraient être en granit et leurs instruments en bois mort qu’on sentirait plus de conviction. Il y’a quelque chose qui sonne faux. Toute cette création sonne faux. « Parasites », « Machinery », « Army Of The Dying Sun » sont de vastes blagues parmi d’autres qui vont faire fureur demain dans les cours de récrés. Cette galette est comme une tête brulée aux effets inversés. Ses premières notes sont sucrées et douces avant de laisser place à une détestable amertume.
En dépit d’un sens de la composition que certains envient sans doute aucun, en dépit des monts et merveilles entrevus il y’a trois ans, la formation me déçoit profondément. La beauté demande un minimum de spontanéité, de franchise et de loyauté. Pour la première fois, je trouve THIS ENDING affreusement laid.
Ajouté : Samedi 21 Février 2009 Chroniqueur : Stef. Score : Lien en relation: This Ending Website Hits: 14111
|