# 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
}
FEAR FACTORY (usa) - Concrete (2002)

Label : Roadrunner Records
Sortie du Scud : 22 juillet 2002
Pays : Etats-Unis
Genre : Death Metal Industriel
Type : Album
Playtime : 16 Titres - 41 Mins
C'est longtemps resté un secret mais avant de signer chez Roadrunner Records, FEAR FACTORY avait déjà mis en boîte un album complet produit par un Ross Robinson alors totalement inconnu et inexpérimenté qui se trouvait être ami avec Dino Cazares. Pas totalement satisfait du résultat et incapable de se mettre d'accord avec Robinson sur les droits de l'album, le groupe décidera finalement de laisser Concrete sur l'étagère et de retourner en studio avec un nouveau producteur pour en ré-enregistrer les meilleurs titres et de nouvelles compos. On connait la suite.
Mais 10 ans plus tard, FEAR FACTORY se sépare suite à des tensions entre ses deux leaders. Gros coup dur pour Roadrunner qui, avec le split de COAL CHAMBER, perd la même année deux de ses meilleures gagneuses! La réaction du label ne se fera pas attendre : un petit tour au grenier et voilà qu'un "nouvel" album complet de FEAR FACTORY arrive dans les bacs, histoire de "faire plaisir aux fans" et surtout de presser les dernières gouttes du citron...
Néanmoins, on aurait tort de considérer Concrete comme un vulgaire attrape-pigeons ou un obscur artefact réservé aux plus inconditionnels des fans. Très éloigné du FEAR FACTORY que tout le monde connait, le groupe à l'oeuvre sur cet enregistrement n'a pas à rougir face aux groupes de Death qui sévissaient à l'époque, bien au contraire! Ce premier essai se révèle être un album de Death tout à fait honnête, avec en prime une très légère coloration Indus et déjà l'utilisation de quelques voix claires, véritable révolution en 1991. Les 8 titres inédits présents ici avaient été abandonnés à l'enregistrement de Soul Of A New Machine au profit de nouvelles compos jugées supérieures. Ils n'ont pourtant rien de honteux. Le plus industriel d'entre eux, "Concrete" sera même réenregistré en 1995 sous le nom de "Concreto" et se retrouvera en bonus-track trois ans plus tard sur l'édition digipack d'Obsolete. Etonnamment, l'original, en dépit de sa production artisanale, vaut largement la nouvelle version. "Soulwomb" connaîtra le même sort pour devenir "Soulwound" en 98, une version tout de même bien différente et plus aboutie. Quant à "Echoes Of Innocence", son thème principal sera repris à l'identique sur "A Therapy For Pain" qui clôt le génial Demanufacture. Si le matériau de base avait été mauvais, il n'aurait pas fait l'objet d'un tel recyclage plusieurs années après! En revanche, "Piss Christ" n'a rien à voir avec le morceau du même nom présent sur Demanufacture.
Concernant les 8 titres qui seront retenus sur Soul Of A New Machine, on note finalement très peu de différences dans leur structure. Seule la production diffère réellement. Et surprise, elle se révèle meilleure sur ce premier effort! Là encore, si Ross Robinson n'avait pas été à la hauteur, il n'aurait pas eu la carrière qu'on lui connaît. Certes, les guitares et la basse sonnent très analogiques, très sales, mais finalement guère plus que sur Soul... Et elles y gagnent une épaisseur bienvenue, tout comme la batterie d'ailleurs. Quant à la voix Death de Burton, elle n'a jamais été aussi caverneuse, effrayante, inhumaine. Le son de Concrete évoque un énorme torrent de boue déferlant sur la ville, quand celui de Soul... tient plutôt du robot-mixeur en furie qui se jette sur son malheureux propriétaire! Niveau trouillomètre et dévastation, on ne joue pas tout à fait dans la même catégorie...
Pour qui n'a pas peur de se frotter à du gros Death bien velu, Concrete s'impose donc comme le meilleur moyen de découvrir les origines d'un groupe incroyablement en avance sur son temps.
Ajouté : Mardi 17 Juillet 2012 Chroniqueur : Cyco_Nico Score :     Lien en relation: Fear Factory Website Hits: 16195
|