# 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
}
MUNICIPAL WASTE (usa) - The Fatal Feast (2012)

Label : Nuclear Blast Records
Sortie du Scud : 13 avril 2012
Pays : Etats-Unis
Genre : Revival Thrash Metal
Type : Album
Playtime : 16 Titres - 38 Mins
Qui aurait cru, il y a encore quelques années, que le vieux Thrash des années 80 deviendrait un phénomène de mode au cours du nouveau millénaire ? Et surtout, qui aurait parié que cet hommage anachronique serait rendu par de petits jeunots ? Pendant que les vieux de la vieille (OVERKILL, ANTHRAX, EXODUS…) maintiennent le style en vie, ce sont surtout les SHORT SHARP SHOCK, VIOLATOR, SKELETONWITCH, WARBRINGER et autres MUNICIPAL WASTE qui lui offrent une seconde vie. On connaît le refrain, la jeunesse implique de la témérité, de la fougue, du peps et ce sont exactement les quelques ingrédients indispensables pour faire vibrer le cœur des vieux Thrasheux. Avec The Fatal Feast, leur cinquième album depuis le Waste ‘Em All de 2003, les Richmondains de MUNICIPAL WASTE s’offrent un périple conceptuel bien tumultueux au cœur d’un Thrash qui marie le vintage et le kitsch.
Le premier constat à établir, c’est que ces américains ont eu besoin d’un moteur pour écrire cet album. La cover, œuvre de Justin Osbourn qui a signé celle du Global Flatline d’ABORTED, est un clin d’œil a peine masqué au cinéma d’épouvante des années 60-70, avec une tendance avouée pour les premiers travaux de George Romero voire même des œuvres plus anciennes comme L’Horrible Docteur Orlof de 1962 ou le Dracula de Christopher Lee, le tout emballé dans un délire de capsule spatiale. Voilà pour le contexte. Musicalement ensuite, MUNICIPAL WASTE a choisi de proposer un disque étouffant, rythmé, avec quelques samples, qui illustrerait bien la mise en œuvre cinématographique de son idée. Sur ce point, la rationalité de l’affaire n’est pas à remettre en cause. Sur la forme, permettez d’émettre quelques réserves. Ne cherchez pas dans cet opus une quelconque perception de virtuosité, car nos amis ne font que délivrer un Thrash Metal bête à manger du foin, probablement rédigé avec quelques grammes de sang dans l’alcool. Outre cet aspect très béotien et primitif, c’est surtout le côté expéditif qui gêne. The Fatal Feast a beau être l’album le plus long de leur discographie avec ses 38 minutes, il n’en demeure pas moins extrêmement haché et difficile à déglutir. Ils ont toujours procédé ainsi, mais il s’avère qu’au-delà d’une certaine durée, ce choix artistique devient réellement discutable. Il y a relativement peu de recherche dans les vocaux éraillés de Tony Foresta, peu d’enchainements dans le jeu de batterie proche du Punk de Dave Witte et plus globalement, peu de fluidité au cœur d’un récit qui navigue à vue entre Crossover et Thrash, sans jamais offrir la pétillance des deux premiers albums. A caractère Ouroboros sur la fin, The Fatal Feast n’en demeure pas moins une œuvre concrète qui met en avant un diable de bassiste en la personne de Land Phil. C’est peu ou prou ce qu’il faudra retenir d’un essai correct mais forcément décevant au souvenir d’un passé autrement plus prometteur.
Ce n’est jamais forcément bon signe quand on commence à parler de stagnation pour un groupe. Après en être arrivé à ce niveau, on attend plus, beaucoup plus d’un groupe de ce standing. Chose rare, MUNICIPAL WASTE est parvenu à concrétiser tous les espoirs qu’on avait placé en eux au lendemain de Waste ‘Em All. Alors après cette petite sieste sur un lit de lauriers, méritée ou pas selon les avis, ce serait trop bête de perdre ce qui est, et restera encore longtemps comme un des plus dignes représentant du Revival Thrash Metal. Chacun sauvera ce qu’il veut sauver d’un album honnête mais qui ne fera pas date.
Ajouté : Mardi 17 Avril 2012 Chroniqueur : Stef. Score :    Lien en relation: Municipal Waste Website Hits: 9638
|