# 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
}
SEBASTIAN BACH (usa) - Kicking & Screaming (2011)
Label : Frontiers Records
Sortie du Scud : 23 septembre 2011
Pays : Etats-Unis
Genre : Hard Rock
Type : Album
Playtime : 13 Titres - 53 Mins
Deuxième album solo du beau Sebastian après le classique Angel Down en 2007, et de nombreuses expériences sur les scènes de Broadway ainsi que quelques participations télévisuelles (Gilmore Girls notamment). Bach s’est cette fois ci entouré de pointures pour mettre tous les atouts de son côté, et nous retrouvons ainsi Bobby Jarzombek (JUGGERNAUT, RIOT, HALFORD, FATES WARNING, DEMONS & WIZARDS, et accessoirement frère de Ron Jarzombek, tricoteur de génie qui officia chez les irréels WATCHTOWER) à la batterie, et l’excellent Nick Sterling (AEROSMITH, KID ROCK, CHEAP TRICK, CINDERELLA, Steve Vai, Joe Satriani, Eric Johnson, Gary Hoey, Peter Frampton, Gavin Degraw, Bachman–Turner Overdrive, Jackyl, excusez du peu..) à la guitare.
Alors, une belle équipe, c’est un fait. Mais cela suffit il pour composer et interpréter un bon album de Hard-Rock bien velu ?
De ce côté-là, pas de souci, ça bastonne, c’est Heavy à souhait, ça rappelle un peu l’orientation de son ancien groupe sur Slave To The Grind (pour le côté rugueux et sombre des guitares et l’atmosphère généralement explosive et tendue), les riffs sont puissants, et les changements de rythme assez récurrents. Tout le monde fait le job, et pourtant, après de nombreuses écoutes, on se dit que ça ne décolle pas vraiment jusqu’à ce que la cinquième piste, « Caught In A Dream » n’intervienne.
Car c’est selon moi le premier morceau où la voix mythique de Sebastian rentre enfin en scène, avec ses modulations diaboliques, ses variations allant du scream pur jus à la séduction venimeuse et veloutée, et surtout son développement musical semble un poil plus travaillé que les quatre titres précédents. Impression confirmée par « As Long As I Got The Music », qui ressemble en tout point à un savant dosage entre le premier et éponyme effort de SKID ROW et son successeur.
Et ça n’est point le superbe « I’m Alive » qui viendra contredire ce soudain virage de mi album, avec sa mélodie magnifique mettant parfaitement en valeur le chant sublime du Bach. Réminiscence des power ballads de la fin des 80’s/début des 90’s, dans laquelle Nick donne toute l’étendue de son talent, ce morceau est vraiment un des points forts de cet album, avec en contrepoint ce vibrato vocal précis qui colle des frissons et que Sebastian manie à merveille.
Le médium « Dream Forever » enfonce un peu plus le clou, et renforce l’impression que cet album dégage depuis le début, à savoir que ce sont les titres les plus accessibles et mélodiques qui emportent l’adhésion de l’auditeur. Non que les titres les plus puissants soient complètement dénués d’intérêt, comme le prouve le très rapide et décalé « My Own Worst Enemy » (un clin d’œil à « My Enemy » qui ouvrait Subhuman Race ?), mais ils tombent le plus souvent dans la redite, la faute certainement à des riffs la plupart du temps similaires. Et ils ne permettent pas vraiment à Baz de s’envoler, et vous conviendrez que brider un chanteur pareil n’est pas la meilleure option possible. Cela dit, sa voix est toujours à des années lumières au dessus de bon nombres de vocalistes de Métal contemporains, et c’est toujours une joie de l’entendre, car il restera pour l’éternité un des meilleurs chanteurs que le Hard Rock ait connu.
Au rayon des réussites, n’hésitons pas à nommer « Tunnelvision » et son riff quasi Thrash qui fait flotter l’esprit de Dimebag Darrell tout autour de la pièce, et le plus nuancé et mélancolique « Wishin’ » qui clôture l’album d’une bien belle façon.
Alors non, Kicking & Screaming, ne sera pas le chef d’œuvre ultime d’un gosier qui aura fait se dresser bien des poils de bras tout au long des années, mais il reste un témoignage sympathique de ce que Baz est encore capable de nous proposer en 2011.
Et un mec qui arrive avec sa seule voix à vous faire occulter une musique parfois très dispensable, vous en connaissez beaucoup franchement ?
Moi non plus.
Ajouté : Mercredi 07 Septembre 2011 Chroniqueur : Mortne2001 Score : Lien en relation: Sebastian Bach Website Hits: 8574
|