# 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
}
ROYAL HUNT (dk) - Show Me How To Live (2011)
Label : Frontiers Records
Sortie du Scud : 1er décembre 2011
Pays : Danemark
Genre : Hard rock néoclassique
Type : Album
Playtime : 8 Titres - 44 Mins
Coup de théâtre à l'aube de l'enregistrement de ce nouvel album ! DC Cooper, ancien chanteur du groupe de 1995 à 1998, réintègre ROYAL HUNT On l'avait senti venir quelques mois plus tôt, lorsque André Andersen, le maître à jouer du quintet, avait annoncé une petite tournée acoustique en Russie et au Japon avec le pompier de Pittsburgh au micro... Selon André, ils auraient repris contact sur Skype avant de monter de nouveaux projets ensemble... ce qui semble encore une fois ahurissant. Je me souviens de confidences alcoolisées après un afternoon show en Belgique lors de la dernière tournée en 2008, d'après lesquelles - en substance - DC était devenu persona non grata par ses frasques de rock star et son attitude de diva. Ce ne sont pas les fans qui s'en plaindront, DC Cooper étant resté la figure de proue historique d'un groupe dont les plus grands faits d'armes restent sans conteste Moving Target (1995) et surtout Paradox (1997). Quant à savoir ce que devient Mark Boals, excellent sur les deux derniers enregistrements, cela semble devenu accessoire...
Que vaut alors cet improbable album du come-back ? On en devient fébrile devant la perspective d'un nouveau coup d'éclat, comme il y a 15 ans. Notons d'abord que le son se rapproche d'avantage de celui de cette belle époque que de X, le dernier disque en date. On remarque de la chaleur dans la production, et une touche old school dans la prise de son. Andersen semble avoir volontairement repris la recette de Moving Target, en témoigne le thème de clavier de « One More Day », qui fait inévitablement penser à l'intro de « Last Goodbye ». Ce premier titre est diablement accrocheur, le pré-refrain est superbe et la rythmique solide. Andréas Passmark (basse) fait son trou, et la doublette qu'il forme avec Alan Sorensen (batterie) est prometteuse. On retrouve les composantes habituelles propres à ROYAL HUNT, des chœurs très en avant, qui accompagnent tous les refrains, et du clavier, beaucoup de clavier. Mais sans démonstration inutile, les soli sont du reste assez rares. En revanche, la guitare de Jonas Larsen, qui remplace Markus Jidell parti grossir les rangs de EVERGREY, fait une entrée remarquée. Et DC dans tout ça ? Il réimprime sa patte sans trop en faire, lui qui usait et abusait de sa singulière voix de tête fait le boulot tout en sobriété, laissant son timbre unique et le talent qui ne l'a pas quitté donner à ces nouveaux morceaux une saveur très agréable. « Another Man Down » et le puissant « Empty Shell » donnent dans le classique, avant le single « Hard Rain's Coming », et ses chœurs imposants qui portent la mélodie de bout en bout. Mais les vrais coups de maître sont à venir. « Half Past Loneliness » possède un refrain que l'on assimile dès la première écoute, une grosse partie de basse et un break piano-voix bien senti. DC Cooper sort de surcroit une performance admirable sur la dernière partie du morceau. Vient alors le morceau éponyme, le plus long du cd, assez banal jusqu'à la magistrale partie instrumentale qui vient ponctuer en beauté un titre dont le final classieux et précis donne des envie de revenez-y !
« Angel's Gone », rapide et mélodique à souhaits dans la plus pure veine RH, conclue un album de trois-quarts d'heure tout juste, qu'il valait vraiment le coup d'attendre. Sans atteindre le brio d'un Paradox, il tient largement ses promesses et laisse augurer d'un bel avenir, si toutefois le retour du banni ne termine pas encore en eau de boudin... D'ici là Frontiers aura réédité les videos des concerts « 1996 » et « Closing The Chapter » dans un double dvd remasterisé (Future's Coming From The Past, date de sortie encore inconnue), et ROYAL HUNT sera – espérons - revenu sur le devant de la scène, à une place qu'il mérite mais qui se refuse au groupe depuis trop longtemps.
Ajouté : Mercredi 09 Novembre 2011 Chroniqueur : JB Score : Lien en relation: Royal Hunt Website Hits: 7902
|