# 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
}
ANDROMEDA (se) - The Immunity Zone (2008)

Label : Nightmare Records / XIII Bis Records
Sortie du Scud : 16 Septembre 2008
Pays : Suède
Genre : Prog Touffu et Inspiré
Type : Album
Playtime : 9 Titres - 76 Mins
Une intro aux limites du Thrash des années 80, des breaks, des contretemps, des dissonances, le tout qui s’affale soudain sur une voix chaude et puissante…Pas de doutes, nous sommes bien sur le terrain du progressif. Lequel ? Et bien, après quelques écoutes, je dirais le bon !
Il est vrai que les ANDROMEDA n’en sont pas à leur coup d’essai, puisque The Immunity Zone est déjà leur cinquième album, et que leur chemin est parsemé de notes en tous genres.
Fortement influencés par DREAM THEATER (mais qui ne l’est pas dans le Prog pêchu ?), les suédois transforment l’essai en multipliant les idées tout en évitant le fouillis indigeste.
Alors certes, les compos semblent respecter à la lettre le cahier des charges, mais il parait difficile de prétendre avoir inventé quelque chose de nouveau dans quelque style musical que ce soit. Le son de l’album est proche de la perfection, avec une latitude incroyable laissée à tous les instruments (un des meilleurs son de basse de ces dernières années, je dois l’avouer !), une brillance qui met en relief toutes les subtilités de composition, et Dieu sait si il y en a !
Le premier morceau, « Recognizing Fate » est un pur bijou à lui tout seul. Plus de sept minutes d’inventivité et de dextérité, il rappelle sur bien des points une fameuse ouverture d’il y a longtemps, qui s’appelait « Pull Me Under »…Mais point de plagiat, la comparaison n’est employée ici qu’à titre d’éloge, un peu facile certes.
« Slaves Of The Plethora Season » nous offre un refrain ad hoc, avec une petite réserve pour le son du clavier, pas toujours au top…Les riffs sont simples, mais redoutablement bien exécutés, la voix toujours en place, et sait se tailler la part du lion sans pour autant en faire trop. On appelle ça un bon chanteur je crois, non ? Certainement un des meilleurs dans le style d’ailleurs !
« Ghosts On Retinas » calme un peu le jeu, et par moments se rapproche même du QUEENSRYCHE d’Empire. Rythme syncopé, voix feutrée, ambiance plombée, tout y est !
« Censoring Truth » à de petits airs de certains groupes des 80’s qui flirtaient parfois avec le Power-Metal, voire le Thrash, comme FIFTH ANGEL, FATES WARNING et autres IRON ANGEL, tandis que « Worst Enemy » oscille entre harmonie pure, breaks endiablés, et sonne même parfois plus 70’s que GENESIS, surtout sur le pont !
« My Star » poursuit et brode sur le même thème, avec un synthé qui rappellerait certainement des souvenirs à Keith EMERSON, tandis que « Another Step » se la joue up-tempo et mesures impaires, avec un David FREMBERG qui fait chauffer ses cordes vocales et confirme son statut de chanteur d’exception. Le solo de Martin HEDIN met le feu à l’ivoire et l’ébène, alors que la rythmique pulse jusqu’à la rupture…qui ne viendra pas !
Les premiers arpèges de « Shadow Of A Lucent Moon » résonnent à peine, et une fois les tables de loi du genre énoncées à merveille, on s’apprête à affronter le gros pavé de l’album, les 17 minutes de « Veil Of Illumination ».
Le groupe se lâche, et nous offre un festival impressionnant de voluptés instrumentales, avec un duo basse batterie à l’unisson, qui double la partie clavier/guitare, à tel point qu’on à la sensation d’écouter un « Metropolis Part III » (les sonorités synthétiques sont d’ailleurs parfois très semblables à ce qu’a pu proposer Kevin MOORE sur les deux premiers DT). Le break central quand à lui nous entraîne sur des chemins beaucoup plus aérés, avec à la clef un solo magnifique de Johan REINHOLDZ, avant que le morceau ne reparte de plus belle sur son thème d’origine.
Le final éthéré est l’épilogue idéal d’un album qui nous aura fait voyager pendant plus d’une heure…
ANDROMEDA d’album en album progresse à vitesse constante pour nous offrir une musique toujours plus peaufinée, mais force est d’admettre qu’avec The Immunity Zone, ils ont fait un pas de géant.
Sorte de pendant totalement Heavy de la bande à Mike et John, ils sont maintenant arrivé à la hauteur des grands frères, et sont même parfois beaucoup plus inspirés…
Pas encore tout à fait parfait, comme Metropolis 2000 ou Empire ont pu l’être en leur temps, mais diablement proches !
Ajouté : Jeudi 18 Décembre 2008 Chroniqueur : Mortne2001 Score :      Lien en relation: Andromeda Website Hits: 10255
|