# 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
}
SIRENS (usa) - For What Remains (2011)
Label : Auto-Production
Sortie du Scud : 28 juillet 2011
Pays : Etats-Unis
Genre : Deathcore mélodique
Type : EP
Playtime : 7 Titres - 28 Mins
Bande de petits veinards. Vous pensiez certainement que votre serviteur avait oublié sa promesse ? Que nenni ! Il avait juré ses grands dieux qu’il ferait de son mieux pour vous tenir au courant de l’évolution en ce qui concerne le dossier SIRENS. Et voilà qu’une petite semaine tout rond après avoir écrit pour The Gates, sa plume aiguisée est de retour pour le plat de résistance, ou du moins ce qu’il en reste. L’effort s’appelle For What Remains et il est sorti en 2011, soit un an après leurs débuts tonitruants. Enfin, peut-être serait-il bon de relativiser les faits. Quand je dis tonitruant, c’est simplement que dans cet océan de conformité, il m’est arrivé de penser que SIRENS pouvait faire quelque chose, surnager un peu, du haut de la sympathique inspiration présente sur son premier rejeton. Mais en matière de Deathcore, la vérité d’hier n’est pas forcément celle de demain. Et ce second EP va faire retomber la pression.
Afin de comprendre ce qui a bien pu se passer, il convient d’analyser la structure de cette rondelle. Déjà, on peut constater qu’avec 7 titres pour 28 minutes, la configuration de For What Remains coïncide étrangement avec les 9 morceaux et 27 minutes de The Gates. C’est le premier rapprochement qu’on puisse faire et il implique évidement les premières hypothèses. Etre en présence d’un clone aurait encore été une meilleure solution que de déguster une seconde mouture coupée à l’eau. La très grande mélodicité du premier EP s’est diluée au profit d’expérimentations plus progressives. Ainsi, l’instrumentale « Lighting The Torch », franchement barbante, tient une place prépondérante au cœur d’un système qui se veut mieux structuré. Seulement voilà, à force de consolider ses bases, qu’elles soient rythmiques ou mélodiques, SIRENS a perdu la folie qui habitait The Gates. La piste éponyme, longue de neuf minutes, traduit l’impatience de ces Américains, qui ont voulu sortir très vite une nouvelle galette au détriment de la créativité. Avec pas moins de 3 instrumentales sur 7 propositions qui monopolisent 8 des 28 minutes de cet opus, on est finalement en présence d’un disque pondu à la va-vite, contenant des morceaux de Deathcore très classiques (« The Wake », « Where The Night Ends »). Etrangement, ce sont surtout les extrémités de ce For What Remains qui ont été les plus séduisantes, beaucoup plus que le coup de feu central. « Isolation », l’ouverture et « Correlation », la fermeture auront été les deux temps forts de cet EP. La première est d’une charmante disponibilité technique, très harmonieuse avec même un petit passage saturé qui fait très Black Metal. Seulement, elle est trompeuse, car on s’imagine volontiers que le reste sera du même acabit. La deuxième clôture cette sortie avec un certain panache. Je ne parle pas des pianos qui œuvrent dans les ultimes secondes mais des arrangements mélodiques plutôt Heavy et solennels ainsi que des samples qui font de ce « Correlation » un bon clap de fin.
Entre les deux, c’est une forme de néant artistique qui voit le jour. Ce vide est encore au stade embryonnaire, certes, mais n’aura besoin de personne pour grandir. SIRENS a perdu sa candeur, sa fraicheur, son culot. J’espère seulement que cette perte sera aussi dramatique que la perte de clés de voiture, qu’on finit toujours par retrouver dans des endroits improbables. C’est le cœur chafouin que je quitte ce second EP, déçu d’avoir placé trop vite de grands espoirs en ces Américains. Mais en vrai gentleman, soyez certains que votre serviteur sera aux premières loges quand SIRENS se sera remis sur le droit chemin.
Ajouté : Mardi 18 Décembre 2012 Chroniqueur : Stef. Score : Lien en relation: Sirens Website Hits: 7304
|