# 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
}
JORN (no) - Dukebox (2009)
Label : AFM Records / Underclass
Sortie du Scud : 28 Août 2009
Pays : Norvège
Genre : Hard Rock
Type : Compilation
Playtime : 16 Titres - 77 Mins
« On le lui a tellement dit que ça doit sérieusement commencer à le saouler : la voix de Jorn Lande ressemble à celle de David Coverdale » .... « Fidèle à son style personnel (...) qui se rapproche étrangement de WHITESNAKE » ... « Un "Fool For You Loving" qui nous confirme les similitudes avec David Covedale »...
Alors au cas où vous ne l'auriez pas compris, le Norvégien Jorn Lande a quasiment la même voix rauque et chaude que son idole David Coverdale. Comparer les deux peut même s'avérer bluffant. Vous avez bien du vous en rendre compte, par le biais des multiples projets auxquels Lande a participé (GENIUS, AYREON, AVANTASIA), des groupes auxquels il a appartenu (ARK puis MASTERPLAN, au sujet de ce dernier il semble être revenu au bercail), ou des albums divers sur lesquels il intervient toujours avec classe (Ken Hensley, The Battle puis The Revenge avec Russell Allen de SYMPHONY X, etc.). En parallèle de cette discographie déjà bien remplie, même si le bonhomme a mine de rien 41 ans, Jorn Lande mène une carrière solo tout à fait respectable. En dépit d'un Lonely Are The Brave en 2008 fort justement égratigné par l'ami Mortne2001 (la chronique ICI) ...
En attendant d'écouter si Lande se rattrape avec son opus tout frais tout neuf Spirit Black (sorti le 5 Juin 2009 chez Frontiers), c'est le label AFM Records qui nous propose la seconde compilation du "Duke". Subtilement intitulé Dukebox, ce Best Of revient sur les Startfire (2000), Worldchanger (2001), Out To Every Nation (2004), The Duke (2006) et donc Lonely Are The Brave. Histoire d'insister un peu, je vous répète que les fans de Coverdale (quelle que soit la période) ne pourront qu'être enchantés. Sans compter que Jorn ne se limite pas au Hard Rock si cher à notre David préféré, et s'aventure parfois sur des territoires un peu plus corsés (et sur le coup, on pense plutôt au DIO de Ronnie James). Et puis l'avantage d'un Best Of, c'est qu'il n'est censé envoyer que du lourd.
Et du lourd, on en trouve sur ce Dukebox ! Du lourd à la WHITESNAKE évidemment !! Un "Man Of The Dark" qui n’aurait pas fait tâche sur 1987 ou Slip Of The Tongue, la puissante ballade "Out To Every Nation" qu'on jugerait interprétée par le père Coverdale, un "Lonely Of The Brave" tout à fait dans la même optique, bref, que de choeurs, riffs, breaks, refrains et arrangements qui évoquent le Serpent Blanc dans sa période Big Rock. Sans compter que certains titres de chansons sonnent comme des clins d'oeil à l'ex-chanteur de DEEP PURPLE, comme cet excellent et groovy "Duke Of Love" (à la limite, Coverdale aurait du déposer le copyright pour tout ce qui se termine par "....Of Love"). Et puis ça sent très fort le "Children Of The Night" sur ce "Stormcrow" avec un excellent solo qui doit être signé Jorn Viggo Lofstad ou Tore Moren. Ce qui permet de rappeler que Jorn Lande a rarement été entouré de manchots ...
Par contre, même pour une compilation, on se rend compte que niveau compos ça ne suit pas toujours. L'avantage d'avoir une si belle voix, c'est de faire passer un titre vraiment moyen pour un morceau correct. Sur "Living With Wolves" (trop fouillis) ou "War Of The World" (avec des lignes de chant trop zigzagantes), la pilule a du mal à passer ... A titre personnel je reste bluffé par la mélodique et superbe "Blacksong", ou quand Lande se jette dans les bras de Dio, son autre père spirituel (les lourds "We Brought The Angels Down" et "Startfire"). Et rappelons que Jorn est aussi, à l’occasion, un putain de chanteur de Heavy Metal ("The Inner Road").
Alors si ce "meilleur de" n'est pas franchement parfait, si on ne note aucune reprise au programme (il y a le Unlocking The Past de 2007 prévu à cet effet), disons qu'il convient largement pour découvrir un artiste au panel musical assez garni et diversifié. Même si, je ne sais plus si je vous l'ai dit, ce Jorn Lande chante vraiment comme David Coverdale ...
Ajouté : Mercredi 16 Septembre 2009 Chroniqueur : NicoTheSpur Score : Lien en relation: Jorn Website Hits: 10163
|