# 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
}
SCARRED (lu) - Gaia-Medea (2013)
Label : Klonosphere
Sortie du Scud : 10 mai 2013
Pays : Luxembourg
Genre : Death / Thrash Metal moderne
Type : Album
Playtime : Titres - Mins
Etait-il logique, ou même seulement légitime, d'aborder ce full-lenght comme une œuvre d'art ? Au moment où la pochette suggérait de sa robe charpentée un bon vin, le Death Metal de SCARRED s'est montré plus volubile, moins psychorigide. Et c'est ce qui fait peut-être la différence. Ce qui fait qu'on a envie de l'aimer, un peu plus que s'il avait été austère et péteux. D'abord Thrash, sous le nom de REQUIEM, le groupe est devenu Death, sous le nom de SCARRED. A moins que ce ne soit l'inverse. Après l'indépendant New Filth Order de 2009, les Luxembourgeois ont trouvé en la Klonosphère le partenaire idéal pour assurer un développement prospère au sein de l'Hexagone. Le Français est friand de ce qui est à peu près authentique, ce qui tombe plutôt bien, puisque SCARRED n'aura de cesse de respecter la tradition métallique de la grosse-claque-dans-ta-gueule tout au long de son Gaia – Medea, qui déroule sa grosse heure de jeu sur fond de mythologie scabreuse. Ou pour être un peu plus clair, ce disque devrait vous plaire.
Il contient un très fort pourcentage de tout ce que le métalleux de base aime. Celui ou celle qui a déjà un jour dans sa vie apprécié MESHUGGAH, MACHINE HEAD, GOJIRA ou NEVERMORE devrait sans problème tomber sous le charme de ce disque aux contours précis et implacables. SCARRED est un groupe de cinq tueurs en chasse, probablement d'ailleurs THE groupe luxembourgeois du moment, si tant est qu'il y en ait d'autres pour organiser un semblant de concurrence. Pourquoi tout cela semble si logique ? J'ai cherché de longues minutes une explication à ce "Psychogenesis" syncopé, à ce "Mosaic" fulgurant pimenté d'un solo à en avaler sa propre giclée de sperme, à ce "Gaia" qui est du genre sauciflard-pâté-stère-de-bois. J'ai trouvé ça bon puis à partir du Death malpropre d'un "Idiosyncrasy" dégoulinant, j'ai trouvé ça très bon. SCARRED a cette faculté de passer d'un titre groovy à un titre Death puis à un autre Thrash sans que cette incertitude stylistique ne dérange. Alors peut-être bien que ce Metal passe-partout est finalement trop sensationnel pour être vraiment inaccessible, peut-être bien qu'il bouffe à tous les râteliers, mais c'est là une prise de tête bien futile pour un album qui se suffit à lui-même. Plus qu'une technique irréprochable, il y a dans Gaia – Medea une atmosphère glauque et lugubre, un parfum de film gore qui le démarque du disque de Death / Thrash lambda. L'intro dérangeante de "The Knot" va dans ce sens pendant qu'une "Empire Of Dirt" totalement disloquée achève de nous convaincre que NEVERMORE est une influence majeure pour eux. A partir d'une production impeccable, SCARRED est parvenu à se sublimer pour faire du terme "Death / Thrash" quelque chose qui ne rime pas avec "impersonnel". J'en veux pour preuve une conclusion d'une douzaine de minute qui atteste du caractère éminemment travaillé de l'album, pour ceux qui n'en étaient pas encore convaincu. Cette relative longueur sur certains morceaux a même parfois tendance à desservir Gaia – Medea qui gagnerait à être un peu épuré lorsque le temps joue en sa défaveur. Pour ce qui est du reste, on n'a jamais eu aussi tort de se fier à une simple pochette qu'aujourd'hui.
Ce second bébé n'est pas une œuvre d'art dans le sens strictement intellectuel de l'expression. C'est une œuvre qui se vit avant de s'observer, qui se transcende avant de se laisser disséquer par des chroniqueurs-légistes trop occupés à trouver le mot juste au bon moment pour savourer pleinement l'esprit du disque. C'est pourquoi après avoir tapé toutes les phrases qui précèdent celle-ci, j'ai réécouté Gaia – Medea avec en tête l'idée que 99% de mon job était déjà fait et qu'il ne me manquait plus qu'une conclusion viable. Un véritable frisson aura suffi à remplir ce rôle.
Ajouté : Dimanche 23 Février 2014 Chroniqueur : Stef. Score : Lien en relation: Scarred Website Hits: 5870
|