# 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
}
LIGHT THIS CITY (usa) - Stormchaser (2009)
Label : Prosthetic Records / La Baleine
Sortie du Scud : 28 janvier 2009
Pays : Etats-Unis
Genre : (Death) Metalcore Mélodique
Type : Album
Playtime : 12 Titres - 50 Mins
La présence de filles (et de très belles filles !) dans les touts nouveaux pionniers du Metalcore moderne et ses variantes est une tendance qui se généralise de plus en plus, au grand damne d’Eric Adams (qui n’aimait déjà pas beaucoup le Metalcore avant…). Candace Kucsulain (et non pas Candice Ku-Klux-Klan chez WALLS OF JERICHO), Kristen Randall (chez WINDS OF PLAGUE), Krysta Cameron (chez IWRESTLEDABEARONCE), Karin Axelsson (chez SONIC SYNDICATE), Logan White (chez UNDYING), Maria Brink (chez IN THIS MOMENT) sont les exemples les plus connus. Mais cette mode n’est pas nouvelle. Angela Gossow empile les piges avec ARCH ENEMY pendant que Doro Pesch empile les rides et les doubles mentons avec DORO (fais-moi mal, NicoTheSpur !). Pourtant, c’est la moyennement charmante Laura Nichols qui a remporté le prix « Hottest Chicks In Metal » décerné par Revolver Magazine pour son œuvre avec LIGHT THIS CITY. Je m’arrêterais à sa performance vocale. Celle qui a sans doute fait la réputation de ce combo sorti de la Bay Area.
En ce qui concerne Stormchaser, il s’agit pour le quintet de son quatrième album depuis 2002. Un rythme régulier soutenu par un Metal tout aussi régulier, relief trébuchant de Metalcore, de Death Metal et d’incursions mélodiques. Ce n’est pas ce que m’avait annoncé la pochette ! J’aurais mis une piécette sur des tonalités davantage Viking ou Pagan moi. Mais bon, c’est l’effet de surprise qui aura joué. Pas longtemps, pas très bien… mais joué quand même. Même la première piste éponyme était complice avec des martèlements tribaux et la sèche un peu folle et Folk en guise d’introduction. Mais c’était sans compter sur LIGHT THIS CITY et sa farouche volonté de faire exploser à la face du monde un Metalcore savoureux, pimenté et fort bien construit. A l’image de « The Anhedonia Epidemic » qui est la première claque de l’enregistrement avec des arpèges de guitare hypnotiques et un jeu de batterie monumental signé Ben Murray. Devant tant de puissance, on en oublierait presque les vocaux de la « Hottest Chicks en chef ». Mais en même temps, c’est de sa faute. L’impact est assez moyen, le timbre rageur mais pas possédé. Une performance assez banale tout au long de Stormchaser où seules les présences de Chuck Billy de TESTAMENT sur « Firehaven » et de John Strachan (THE FUNERAL PYRE) sur « The Collector. Part 2 : Donor » rehaussent le niveau. Le salut viendra uniquement de la triplette aux cordes et du batteur qui boxent dans une catégorie différente. On avait fait tant de publicité pour miss Nichols que le résultat, sans pour autant être mauvais, est en-dessous des espérances. Et du coup, ce sont les autres qui en profitent sur des plages comme « The Collector. Part 1 : Muse » avec un incipit du « Death de la mort qui tue », « A Desesperate Resolution » qui tape dans des solos de guitare virtuoses, « Bridge To Cross » au tempo soutenu et mouvements variés et marginaux ou « Self Portrait » qui a des mauvais airs de NEAERA. Le produit de toutes ces additions est d’un bon niveau même s’il semble parfois au bord de l’indigestion. 50 minutes pour 12 constructions cimentées « Metalcore » (en règle générale), ça peut paraître usant mais c’est surtout très long. Ceux qui ont les nerfs à fleur de peau feraient mieux de reculer un peu.
Les autres pourront tenter leur chance. La décision leur appartient. Les risques, ils en sont conscients. Le Metalcore doit être l’un des genres les plus difficiles à apprécier. Mais quand on l’a dans le cœur, c’est à jamais ! Je ne sais pas si LIGHT THIS CITY participera pour beaucoup à la conception de ce petit déclic qui vous fera aimer le style mais en tout cas, il pourra vous aider à en consolider les bases. Toute expérience est bonne à prendre.
Ajouté : Vendredi 25 Septembre 2009 Chroniqueur : Stef. Score : Lien en relation: Light This City Website Hits: 9769
|