# 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
}
I DECLARE WAR (usa) - I Declare War (2011)
Label : Artery Recordings
Sortie du Scud : 11 octobre 2011
Pays : Etats-Unis
Genre : Brutal Deathcore
Type : Album
Playtime : 10 Titres - 37 Mins
En quête d’inspiration pour aborder le tout nouvel opus des gros costauds d’I DECLARE WAR, je me suis dis qu’il ne serait pas totalement idiot de relire le papier que j’avais écrit jadis pour Malevolence, histoire de savoir déjà approximativement dans quelle direction cette sortie serait susceptible d’aller. La condition est désormais claire comme de l’eau de roche, si ces mecs arrivent à proposer deux compos honnêtes sur l’ensemble de l’œuvre, ce disque sera considéré comme meilleur que son prédécesseur. De toute façon, il leur sera bien compliqué de faire pire que ce grotesque monceau de brutalité coreuse proposé en 2010. Et pourtant, en y réfléchissant bien, il n’y a que seize petits mois qui séparent ces deux disques, autant dire que les probabilités d’entrevoir une nette évolution sont assez faméliques, quand on sait que la logique actuelle de productivité implique d’enchaîner albums sur albums, en s’octroyant parfois une petite pause tournée.
Tout ça pour dire que contre toute attente, I DECLARE WAR s’est bel et bien repenti. La pochette très glauque, presque Black Metal de cette sortie éponyme le confirme partiellement. Et ce qui est purement génial ici, c’est qu’en six minutes et trente secondes montre en main, les américains ont déjà fait plus que sur Malevolence. « I, Tormentor » démarre au quart de tour, avec un riffing technique et vif, qui débouche sur une lente double-décélération, d’abord mid-tempo puis carrément down-tempo. Trois rythmes, trois ambiances pour un premier morceau assez explicite qui sera suivi par « Misery Cloud », idéal pour mosher. On y retrouve une facette très groovy, généralement caractéristique de groupes de qualité comme ANNOTATIONS FOR AN AUTOPSY, avec des riffs sourds, quelques breaks et une batterie qui fait cavalier seul. Plus moderne, plus dynamique et moins austère, ce Deathcore correspond davantage à l’image qu’on s’en fait généralement. Là où Malevolence se montrait inaccessible et exagéré, I Declare War fait dans la simplicité et se base sur de nombreux changements de tempo, plutôt que sur des rythmiques linéaires. Le groupe se désolidarise de sa ligne directrice pour ouvrir son panel d’influences, voguant désormais entre CHELSEA GRIN, SALT THE WOUND, parfois KING CONQUER. Et si cette galette s’en retrouve plus accessible, elle reste néanmoins difficile à chier. I DECLARE WAR a conservé son aspect granuleux, mais a juste eu la bonne idée de faire d’en faire des machines à tubes, tels que sont « Final Hour » et sa conclusion dantesque ou « Weak Minds » en guise d’outro bien tourmentée. Mon seul regret est l’absence totale de pistes du calibre de « Putrification Of The Population » qui mettait en avant le peu de musicalité qu’ils possèdent, et ce n’est certainement pas le pauvre motif mélodramatique en fin de « Pillow Talk » qui suffira à inverser la tendance. Tout ça est fort heureusement compensé par la découverte d’un certain talent qu’on ne soupçonnait plus, par un album servi dans un enrobage gourmand et glucidique et simplement par les nets progrès réalisés par les ricains. Reste juste encore un peu de travail à accomplir au niveau du chant car une fois encore, Jamie Hanks cherche des notes abyssales et plus graves encore que ce dont il est capable. On a juste l’impression qu’il pousse tellement fort qu’il va finir par se chier dessus tôt ou tard. A part ça, tout va bien j’ai envie de dire.
Réelle satisfaction que ce disque ? Trois fois oui. Parce qu’on ne pouvait pas s’attendre à quelque chose qui change réellement de Malevolence dans un laps de temps si restreint. Si I DECLARE WAR sonne encore aujourd’hui comme de très nombreux groupes, au moins il sonne comme les meilleurs, ce qui n’était pas le cas encore un an auparavant. J’ai très envie de croire qu’après six années de tâtonnements, les mecs ont fini par prendre la bonne porte, et qu’avec ce disque, on pourra en toute logique enfin les prendre au sérieux.
Ajouté : Mercredi 09 Novembre 2011 Chroniqueur : Stef. Score : Lien en relation: I Declare War Website Hits: 8940
|