# 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
}
BACKFIRE! (nl) - My Broken World (2012)
Label : GSR Music
Sortie du Scud : 17 février 2012
Pays : Pays-Bas
Genre : Hardcore
Type : Album
Playtime : 15 Titres - 37 Mins
C’était en 1996. Le groupe Néerlandais BACKFIRE! sortait alors son album le plus incontournable, un certain Rebel 4 Life. Seize années plus tard, Dave, Pat, Wyb et Igor sont entrés dans la phase adolescente de leur carrière. A l’âge où les idées sont noires, où les propos sont volontairement provocants, il n’y aura rien d’étonnant à trouver en My Broken World, leur septième projet studio, un déchainement de violence incontrôlée et des ambiances sombres, qui éclipsent l’innocence des premiers balbutiements. Après une période de réflexion artistique longue de trois ans, le quatuor est revenu à la raison et sort enfin de la pénombre dans laquelle il s’était engouffré. A juste titre. My Broken World présente au Hardcore européen sa vision brutale de la situation. Et si le style n’a jamais été d’une grande tendresse avec la société actuelle, les mots très durs de BACKFIRE ! résonneront avec autant de sagesse et d’aura que les pensées de Confucius.
Les Pays-Bas ont toujours eu une affinité très particulière avec le Hardcore. Il peut être authentique, comme celui de BACKFIRE!. Ou encore déchainé, tel celui pratiqué par BORN FROM PAIN. Enfin, on en trouve également une mouture contemporaine à tendance nerveuse avec ALL FOR NOTHING, pour ne pas les citer. Mais quelle que soit la situation, ils ont tous un point commun. La pression qu’ils mettent sur l’auditeur. My Broken World est un album lourd, désespérant, rugueux. On se heurte à un mur de son qui s’abat sur nous dans un fracas monstre. « Broke, Bruised And Bitter » résume déjà parfaitement ce que sera ce CD. Expéditif (moins de deux minutes au compteur) avec des riffs corrosifs, des frappes de batterie très Punk mais surtout, un vocaliste, Pat, en forme olympique. Le bonhomme est une légende dans le milieu, parce que son chant est d’une singularité rare et qu’il n’y a pas mieux que le sien pour nous convaincre de rejoindre le combat. Dès qu’il ouvre la bouche, on se sent concerné. Certes, le débit avec lequel il vomit ses paroles acerbes n’est pas des plus sereins. Mais il y a tellement de haine dans son verbe, tellement de détresse dans ses beuglements qu’on est sur le cul. Le Hardcore possède un paquet de bons vocalistes. Mais Pat reste son maître-chanteur le plus énigmatique. Et il fallait bien ça, parce que musicalement, ça suit le mouvement. Il y a une forme de mystère qui émane de cette œuvre. D’où vient-elle ? A qui s’adresse-t-elle ? Et surtout, pourquoi tant de folie, de frustration et de rage ? Fidèle à sa réputation d’empêcheurs de tourner en rond, BACKFIRE! refuse l’innovation, concentrant toute son énergie sur des brûlots de Hardcore compacts, qui osent parfois l’un ou l’autre appel de phare à la scène New-yorkaise (« Guard Me », « Does It Hurt ? »). Derrière, on retrouvera également des créations moins inaccessibles, comme la pachydermique « Existence Is Punishment » qui marque une rupture rythmique importante dans cet opus. Il fallait bien ça pour pouvoir reprendre une bouffée d’oxygène entre « This One Is For Us » et « Choke On Regret », deux bombes atomiques qui défilent aussi vite qu’un time-lapse. Enfin, BACKFIRE! nous lâche la grappe avec « XX 13 ». Mais pas sans avoir pris soin de nous souhaiter d’aller « brûler en enfer ». Ils sont comme ça les Néerlandais. Pleins de charmantes attentions.
C’est d’ailleurs tout le paradoxe de cet album. Si on a la sensation qu’on s’occupe bien de nous pendant ces 15 morceaux (si vous voyez ce que je veux dire), on ne peut s’empêcher de grimacer devant la teneur résolument triste et négative qu’il dégage. BACKFIRE! est un groupe rempli de haine, qui ne semble plus du tout croire en un avenir radieux. Il sera impossible de nier qu’entre le Rebel 4 Life de 1996 et le My Broken World de 2012, l’atmosphère s’est détériorée. Au final, cette œuvre pose un constat difficile mais lucide sur quinze années de décadence. Et visiblement, ce n’est pas près de s’arrêter.
Ajouté : Mercredi 03 Octobre 2012 Chroniqueur : Stef. Score : Lien en relation: Backfire! Website Hits: 8784
|