# 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
}
WARBRINGER (usa) - Waking Into Nightmares (2009)
Label : Century Media Records
Sortie du Scud : 25 mai 2009
Pays : Etats-Unis
Genre : Thrash Metal old-school
Type : Album
Playtime : 10 Titres - 40 Mins
On remet ça ! Il y'a un an déjà, personne n'était tombé dans le panneau. Peut-être vous souvenez-vous de cette vieille cover toute moche qui brûlait les yeux mais qui au fond, allait fort bien avec ce vieux Thrash tout bien rafistolé par des petits minots américains. Etait alors représenté un char d'assaut (ne me demandez pas le nom, mes connaissances s'arrêtent là) au canon fumant, ma foi, fort représentatif de cette tête explosive qu'avait été War Without End. Rebelote pour Waking Into Nightmares. La cover est toujours toute moche, mais cette fois, y'a une bonne excuse puisqu'elle est signée Dan Seagrave (vous savez, le Altars Of Madness de MORBID ANGEL, c'était lui. Le Like An Ever Flowing Stream de DISMEMBER, c'était aussi lui. Et le Effigy Of The Forgotten de SUFFOCATION, c'était encore lui). En tout cas, si la laideur de l'artwork est toujours respectée, le rapport entre le titre et la musique, est lui aussi maintenu. War Without End, c'était la guerre. Waking Into Nightmares sera votre cauchemar.
Les mecs qui composent WARBRINGER ont à peine la majorité française et pas tous la majorité américaine que Century Media Records a flairé la bonne affaire. Je me souviens avoir découvert ce groupe avec le titre "Dread Command" qui figurait sur une compilation généreusement envoyée par Imperial-Clothing avec une commande de T-shirt's à l'effigie de mes formations chéries. Et déjà à l'époque, je me demandais ce que des thrasheux de la vieille école venaient faire entre HEAVEN SHALL BURN, SUICIDE SILENCE et WINDS OF PLAGUE. Alors quand on écoute ce chant si particulier de John Kevill, qui prêche comme un possédé, ça fait mal au fondement de se dire que c'était il y'a déjà un an. Tout est allé au final assez vite pour nos cinq californiens qui nous ressortent les vieilles astuces de grand-mère pour pondre un opus dans la lignée du précédent. Les cordes tenues par John Laux, Adam Carroll aux guitares et Ben Bennett à la basse sonnent égoïstes et éculées bien que moins authentiques qu'auparavant. Le côté "roots" s'est estompé et il met en lumière une limpidité plus flagrante, à grands renforts de solos alambiqués ("Scorched Earth", "Abandoned By Time", "Senseless Life"). Mais le grand fort de WARBRINGER, c'est cet esprit de warrior dégénéré qui ne souhaite pour ses enfants qu'un champ de ruine sur lequel il pourra jouer aux osselets. Destruction et DESTRUCTION sont d'ailleurs les principales sources d'inspirations des ricains. Le concept de la dévastation est omniprésent, tant des les lyrics explicites que dans les rythmes chaotiques et la formation allemande est à nombreuses reprises évoquée dans le maniement de la six-cordes. La manière qu'a Nic Ritter de chatouiller ses futs (pas que de bière...) est aussi maligne. Il s'en dégage un réel sentiment de performance, en particulier sur ce tube qu'est "Prey For Death", sans doute la plus groovy et la plus achevée des propositions. Et le contraste avec l'inquiétante instrumentale "Nightmare Anatomy" qui lui succède et où les guitares s'envolent au septième ciel n'en est que plus saisissant.
Alors si vous êtes frustrés d'entendre que le Thrash old-school c'est une musique faite par des morts pour des vieux, faites l'ouverture de votre disquaire le 25 mai 2009, jetez-vous sur Waking Into Nightmares et vous aurez la version "le Thrash old-school c'est une musique faite par des jeunes pour des morts". Et à ce moment-là, vous commencerez votre cauchemar et réaliserez l'étendue des dégâts.
Ajouté : Jeudi 16 Avril 2009 Chroniqueur : Stef. Score : Lien en relation: Warbringer Website Hits: 9395
|