# 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
}
SUNSTORM (usa/de) - Emotional Fire (2012)
Label : Frontiers Records
Sortie du Scud : 28 février 2012
Pays : Etats-Unis / Allemagne
Genre : Hard FM
Type : Album
Playtime : 11 Titres - 42 Mins
Mais comment fait Joe Lynn Turner, après toutes ces années de tournées et d’albums avec tant d’artistes différents, pour garder la flamme, l’envie, la motivation ? Entre les albums enfantés aux côtés de Glenn Hughes (HTP, malheureusement avorté après deux opus), le RAINBOW qu’il a monté avec le propre fils de Ritchie Blackmore, une carrière solo faite de hauts (l’album The Usual Suspects) et de bas (Live In Germany, en 2008), le bonhomme semble inépuisable. Pourtant, de tous les projets dans lesquels il est impliqué, c’est peut-être celui avec SUNSTORM qui présente le plus d’intérêt. Pour la bonne et simple raison que Joe a su s’entourer de gars performants dans le style. A savoir une grosse partie de PINK CREAM 69, comme le méga-connu producteur Dennis Ward (basse, guitares), le mésestimé guitariste Uwe Reitenauer, le batteur Chris Schmitz, mais aussi Jochen Weyer aux claviers.
A dire vrai, ce n’est pas Joe Lynn Turner qui est allé chercher ces musiciens. C’est Dennis Ward, fortement encouragé par le label Frontiers, qui a poussé le père Turner à profiter du contexte SUNSTORM pour redonner vie à d’anciennes compos des années 80, sur lesquelles il avait travaillé pour d’autres artistes en tant que choriste. C’était déjà le but, en fait, sur les deux premiers opus de SUNTORM. Ainsi « Emotional Fire » et « You Wouldn’t Know Love » sont des reprises de Cher datant de 1989 (sur l’album Heart Of Stone) et sur lesquelles Michael Bolton avait posé sa griffe. De même, « Gina » figurait sur l’album The Hunger (1987) du même Bolton. Et franchement, on ne peut pas dire que cette reprise restera dans les annales, avec son refrain affreux, à la limite du supportable.
Il faut dire que les morceaux nommés par des prénoms féminins sur Emotional Fire cultivent ce côté insupportable, comme « Emily » et ses « ooohh baby » qu’on ne veut plus entendre. On garde en mémoire les propos d’Yngwie Malmsteen lorsqu’il avait évincé Turner de son groupe : « avec Joe, les paroles tournaient toujours autour de ooh baby, let’s fuck tonight ». Et sur ce coup là, on ne peut pas lui donner tort. A la limite, que « Lay Down Your Arms » sonne comme du sous-BON JOVI, bon à passer à la radio au milieu de la soupe habituellement servie sur les ondes, pourquoi pas. Sauf que jouer du Hard FM en 2012 se révèle un exercice dangereux, au risque de passer pour un ringard. Et ça, Joe Lynn Turner et Dennis Ward l’ont bien compris.
Car pour tout dire, mis à part ces quelques faux pas, Emotional Fire a de la gueule. Certes, les claviers étiquetés années 80 sur « Wish You Were Here » (vous savez, un peu comme ceux du « Is This Love » de WHITESNAKE en 1987 … hum …) continueront à irriter les détracteurs de Joe. Pourtant, que voilà un titre entraînant … Emotional Fire regorge de titres accrocheurs, efficaces, que ce soit le premier titre assez musclé « Never Give Up », les mid-tempos ravageurs « You Wouldn’t Know Love » et « Emotional Fire », l’énergique « Torn In Half », et même le stéréotypé FM « Follow Your Heart ». De toutes façons, les avis divergeront toujours, pour les allergiques au Hard de Joe Lynn Turner, cette musique sucrée sera toujours envahie par des claviers aux sons d’un autre temps. Pour les autres, comme votre serviteur, Emotional Fire a des allures de parfaite bande son pour une virée à Los Angeles à la nuit tombée. Et tomber dans les bras de Madame en regardant ces lumières scintillantes sur fond de coucher de soleil …
Il faut rendre hommage au boulot abattu par Dennis Ward à la production, qui donne à Emotional Fire un son « actuel » (le mot est fort, je vous l’accorde) et lui évite de sombrer dans la parodie … De même, Uwe Reitenauer ravira les amateurs de guitares, il faut l’entendre briller sur ses nombreux soli, « Never Give Up » en tête. Quant à Joe, il continue de bien chanter, de très bien chanter même (avec une émotion toute particulière sur la ballade « All I Am »), si l’on aime son timbre toujours un peu trop lisse.
C’est là toute la complexité d’un album comme Emotional Fire. Difficile de sortir un tel album à notre époque, et pourtant SUNSTORM réussit cette épreuve avec brio.
Ajouté : Lundi 19 Mars 2012 Chroniqueur : NicoTheSpur Score : Lien en relation: Sunstorm Website Hits: 7690
|