# 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
}
FOREVER IN TERROR (usa) - The End (2009)

Label : Auto-Production
Sortie du Scud : 19 mai 2009
Pays : France
Genre : Metalcore mélodique
Type : Album
Playtime : 10 Titres - 36 Mins
En ce samedi de finale féminine de Roland Garros, j'ai décidé de me la couler douce en attendant de mater les gambettes de Sharapova. Point de grosse production, point d'album controversé, point de "supergroup" qui nécessiterait des heures d'investigations mais FOREVER IN TERROR. Il y a quatre ans, quasiment jour pour jour, j'écrivais pour ce groupe ohioain une de mes premières chroniques et subissait par la même occasion un de mes premiers revers de manche. Deux ans se sont écoulés entre la sortie de Restless In The Tides (2007) et de The End (2009). C'est donc avec beaucoup de retard que je prends le train en marche, mais également avec beaucoup de recul. Une absence d'autant moins préjudiciable que ces américains, probablement chiffonnés par la critique négative, n'ont pas eu le courage d'aller plus loin. Peut-être n'ont-ils pas eu entièrement tort.
Car il a beau n'avoir que trois ans d'âge, ce Metalcore a très mal vieilli. Il est probablement une victime collatérale de l'évolution constante et fulgurante de la scène ces dernières années. Une quantité énorme de groupes a vu le jour et avec eux, des idées, parfois intéressantes, parfois grotesque. Enfin, c'est toujours mieux que FOREVER IN TERROR qui semble n'en avoir jamais eu. Voilà quatre ans que j'écoutais leur premier effort. Et à l'écoute du second, je me sens comme revivre le moment où je leur ai collé un 5/10. Dans le grain des guitares, dans les envolées mélodiques théâtrales, dans les tempos proches du Punk ou dans les chants clairs de Chris Bianchi (qui ne sont pas autotunés, rendons à César...), tout n'est qu'une réinterprétation grossière et platonique du Restless In The Tides de 2007. Evidement, certaines choses ont évolué. Je n'avais notamment pas le souvenir d'un album qui utilisait autant les artifices que sont les pianos et autres synthés. Celui-ci en use et abuse, dès "Sunlight Sands" qui accroche immédiatement l'oreille, mais qui souffre d'une écriture bizarroïde. Le motif au piano n'est pas mauvais, mais les guitares qui l'accompagnent sortent des accords improbables. Puis tout se cale subitement dans un Metalcore guimauve, avec un refrain clair pas dégueu mais également avec des broderies qui font grimacer. Fidèle à l'image que renvoyait son premier opus, FOREVER IN TERROR demeure capable de passages très réussis, très bien brossés, mais se perd dans des structures technico-mélodiques qui frisent le ridicule, avec des arrangements inadéquats, comme ce final Lounge jazzy sur "Overboard". La présence fortuite de Joey Nelson (BENEATH THE SKY) sur la très synthétique "Lunar Fortress" apporte très peu d'écot à l'ensemble, tout comme "Definite Finite Infinity", une instrumentale qui aurait mérité davantage de quiétude. Pour finir, aucune amélioration dans les screams fadasses de Chris Bianchi qui n'a pas le coffre nécessaire pour rendre ses vocaux percutants. La production, pour sa part, s'est légèrement aérée, ce qui aide à digérer un pâté granuleux.
Pas d'amélioration en vue donc pour FOREVER IN TERROR. Certains éclairs font parfois mouche mais ces moments sont d'une infinie rareté. The End souffre à tous les niveaux de son manque de créativité, d'originalité et de percussion. Et si la note va jusqu'à descendre sous la moyenne, c'est principalement pour pénaliser l'utilisation aléatoire des claviers qui ne servent qu'à cacher la misère et souligner l'absence d'au-moins un tube, comme l'avait été "The Chosen Ones" sur Restless In The Tides. Aujourd'hui plus que jamais, ce groupe semble au bord de l'implosion. Et son salut dépendra évidement de la prestation proposée sur leur nouvel enregistrement, prévu pour la deuxième moitié de 2012.
Ajouté : Mercredi 13 Juin 2012 Chroniqueur : Stef. Score :   Lien en relation: Forever In Terror Website Hits: 8408
|