# 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
}
SAGA (ca) - Worlds Apart Revisited (2007)
Label : InsideOut Music / Wagram
Sortie du Scud : 30 avril 2007
Pays : Canada
Genre : Progressif
Type : Album
Playtime : 22 Titres - 116 Mins
Il y a des CDS qu’on demande, parce que l’on est fan du groupe, et qu’une bonne critique dithyrambique de temps en temps ça fait du bien (quoiqu’on puisse parfois être cruellement déçu, je ne parle pas de METALLICA et de St Anger bien sur…). Il y a des CDS qu’on demande parce qu’un énorme buzz entoure le groupe, nouveau venu la plupart du temps. Et il y a des CDS qu’on demande sans trop savoir pourquoi, alors qu’on connaît le groupe, et que l’on n’a jamais été un grand fan. C’est mon cas ici. Un autodafé involontaire. J’ai demandé le double live de SAGA. Alors qu’au grand jamais, je n’ai été amateur de leur musique.
30 ans de carrière, une paille. Des line-ups à gogo, des albums à la pelle, quelques hits mineurs, des concepts albums, comme tout groupe de progressif qui se respecte. Seulement SAGA n’a jamais été capable de pondre un Tales From The Topographic Oceans, The Wall, Operation Mindcrime, ou autre The Lamb Lies Down On Broadway.
Groupe majeur pour ses fans, anecdotique pour les historiens de la musique, SAGA n’a jamais fait l’unanimité, un peu le même genre de handicap que connaît IQ depuis des années. Pourtant, ses musiciens ont toujours été au dessus de tout soupçon, et bien des titres auraient comblé d’aises pas mal d’autres combos dans le monde.
Ici, on rend hommage à Worlds Apart, album sorti en 1981, et jusqu’à lors, leur plus grand succès. Les pivots sont toujours la, les frères Crichton, et Michael Sadler, et les classiques aussi. Le son de l’album est rond, clair, et rend justice au niveau technique des instrumentistes. La voix de Sadler est mise en avant bien sur, mais pas au détriment de la guitare, ni de la rythmique. L’équilibre parfait. Et c’est bien ça le principal reproche que l’on puisse faire à SAGA, et qui se trouve encore plus flagrant sur ce CD. C’est propre, carré, rien ne dépasse, pas la moindre étincelle de folie.
C’est une métaphore en soi. Une musique de qualité, bien interprétée, par des musiciens à l’aise dans leurs baskets, mais qu’est ce qu’on s’ennuie ! C’est joué comme à la parade, on se croirait presque à la fête de la musique, version luxe quand même.
Le premier CD est le parfait petit manuel de l’ennui total. Mis à part le mini hit des 80’s, « On The Loose » (pas génial d’ailleurs), et quelques titres, le remuant « You’re Not Alone », et le créatif et lourd « Ice Nice », pas de quoi finir le cul vissé dans l’ampoule du plafond !
Le second CD, plus appréciable, sauve l’ensemble d’une condamnation sans appel, avec son panaché de classiques, malgré une intro lourdingue (« Time’s Up »). L’interprétation se veut plus enjoué, plus légère, et le métier des zigs prend le dessus. Bon, on ne va pas courir non plus revendre son intégrale de KING CRIMSON, mais les titres passent mieux, et on commence à se réveiller un peu. Le magnifique « No Regrets », le bon instrumental « Conversations », le bon « No Stranger », et le sautillant « Humble Stance » remplissent leur office, et le triptyque final, « Don’t Be Late », « How Long » et « Careful Where You Step » rend le public en joie, sans tomber non plus dans l’hystérie. Alors bilan plus que mitigé, et malgré le respect que peut m’inspirer la longévité du groupe, je persiste à dire que si SAGA est toujours resté à l’ombre des ténors du genre, il y a forcément une bonne raison, plus qu’apparente sur ce double live. Il leur à toujours manqué le coté théâtral de GENESIS. La folie de Roger Waters. Le sens de l’expérimentation total de KING CRIMSON. Le jusque boutisme de SOFT MACHINE.
Trop propres. Trop gentils.
On ne compare pas une Testarossa avec une vulgaire Porsche 911.
Question de frime, c’est tout...
Ajouté : Vendredi 03 Août 2007 Chroniqueur : Mortne2001 Score : Lien en relation: Saga Website Hits: 12757
|