# 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
}
GAMMA RAY (de) - Master Of Confusion (2013)

Label : earMusic
Sortie du Scud : 15 mars 2013
Pays : Allemagne
Genre : Power Metal
Type : Album
Playtime : 10 Titres - 48 Mins
Vous vous souvenez de "La Zizanie", 15ème volume des aventures de notre fierté nationale (non, pas Jamel Deux-Bouses ni Franck Ribéry) Astérix le Gaulois ? On y voit Abraracourcix, ce bien brave chef un peu soupe-au-lait en train de préparer fièrement devant un bouclier éclatant son discours d'anniversaire : "quelle surprise, mes amis, je reste sans voix ...". Evidemment, le mec, il sait très bien que tous les moustachus du village vont lui préparer un banquet et lui offrir les mêmes cadeaux que d'habitude : un glaive forgé par Cétautomatix, un menhir taillé par Obélix (par contre on ne sait pas si la femme d'Agecanonix lui taille quelque chose), un poisson empaillé par Ordralfabétix, etc...
Et ben, avec GAMMA RAY, c'est la même. Que déboule un nouvel album ou un EP comme ce Master Of Confusion, on pourra s'adresser de la sorte au père Hansen : "quelle surprise, Kai, on en reste sans voix". Je vous le donne en mille, la nouvelle version de "Send Me A Sign" (PowerPlant), ou de "Heaven Or Hell" (No World Order), ou de "Time To Live" (To The Metal ) se nomme donc Master Of Confusion. Celui-là, c'est un peu le glaive offert par le forgeron à son sanglier de chef, il brille, il envoie bien, il taille sévère, mais on l'a déjà 53 fois en stock. Et le titre d'ouverture, le très bon "Empire Of The Undead" sonne étrangement comme le JUDAS PRIEST énergique de l'époque "Freewheel Burning". Non en fait on dirait même le riff du "Motorbreath" de METALLICA ... On ne va pas répéter la même chose au sujet de GAMMA RAY, alors pour l'analyse critique du chroniqueur qui veut faire du zèle, n'hésitez pas à vous rendre sur les chroniques précédentes du quartet allemand. Je vous certifie juste que les soli de Hansen et de Henjo Richter déchirent tout, comme d'habitude.
Alors ce mini-album présente tout de même quelques avantages. Avant tout, il convient de préciser qu'il dure presque une heure (avec des titres live, certes ...) alors que les albums de certains n'excèdent pas les 40 minutes ... Bon effectivement, si c'est pour nous remplir un CD avec des reprises inutiles comme le "Death Or Glory" d'HOLOCAUST, quel intérêt ? A l'inverse, le "Lost Angels" de SWEET (incroyable comme on dirait du QUEEN !) est repris avec une classe et un enthousiasme que l'on ne pourra jamais enlever à Hansen et sa bande ... dont fait maintenant partie le batteur Michael Ehré, puisque Dan Zimmerman a démissionné en 2012. Il en avait peut-être marre de jouer "Send Me A Sign", "Heaven Or Hell", et "Future World" tous les soirs, mais bon, bref, il est parti.
En guise d'adieu à son batteur, GAMMA RAY offre en deuxième partie de Master Of Confusion une série de morceaux enregistrés à Bochum (prononcez "Boroume" et pas "Bochume"). Histoire de s'éclater une dernière fois sur des plus-ou-moins classiques du combo, quitte à dépoussiérer le génial "The Spirit" (qui date quand même de 1991, sur Sigh No More), à pousser la chansonnette avec Michael Kiske qui sublime sans forcer "Time To Break Free", à rappeler que "Farewell" est une bien belle ballade, et à rejouer ce "Wings Of Destiny" témoin d'un album fort sous-estimé et pourtant incontournable dans le domaine du Power Metal, à savoir Power Plant. Par contre, Kai, "Insurrection" et ses interminables 12 minutes, t'étais pas obligé ...
En tous cas, ces six morceaux captés sur scène rappellent qu'à une certaine époque, GAMMA RAY se voulait inspiré. Il serait bon de se servir de ça pour redorer un peu le blason d'un groupe qui tourne en rond depuis plus d'une décennie. Ce serait une bonne surprise !
Ajouté : Vendredi 07 Mars 2014 Chroniqueur : NicoTheSpur Score :     Lien en relation: Gamma Ray Website Hits: 7732
|