# 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
}
PAIN OF SALVATION (se) - Road Salt One (2010)

Label : InsideOut Music
Sortie du Scud : 2010
Pays : Suède
Genre : Vieux Rock fantaisiste
Type : Album
Playtime : 12 Titres - 52 Mins
Avec ce petit côté mont Rushmore et son contraste sépia, la pochette du nouveau PAIN OF SALVATION pourrait presque servir au test de Rorschach, plus connu sous le nom de « test des tâches d’encre ». A ce petit jeu, pris très au sérieux par nos amis psychiatres, je vois le présage d’un trip peu susceptible de plaire à ma petite personne. C’est grave docteur ? Toute confession faite, PAIN OF SALVATION, c’est le Metal progressif dans son plus simple appareil, un style qui me provoque démangeaisons et picotements. Convulsions à moindre mesure. Du moins, c’était du Metal progressif. Car avec Road Salt One, septième full-lenght des suédois, vous risquez fort d’être décontenancés. Le quartet effectue un flashback de trois bonnes décennies, quand le Rock psychédélique reluisait de tout son éclat. C’est donc un changement, plus ou moins radical dans leurs petits plans artistiques.
« No Way » ouvre le chemin et c’est à croire que PAIN OF SALVATION ai voulu offrir une seconde jeunesse aux MOODY BLUES ! On croirait entendre un des groupes favori de mon père ! Un esprit de Blues/Rock américain et des guitares écorchées… Les derniers souvenirs que j’avais de ce groupe remontaient pourtant à 2007, avec un Scarsick autrement plus dynamique… autrement plus écoutable. Les cordes lourdes et mélancoliques sont allées voir si l’herbe est plus verte ailleurs, laissant libre espace à une créativité de façade et à une énergie proche du néant. Les compositions ont encore moins de pêche qu’un album acoustique de CANNIBAL CORPSE et j’ai bien l’impression que PAIN OF SALVATION justifiera ses créations guignolesques comme « Sleeping Under The Stars », digne du cirque Pinder avec un Achille Zavatta tout juste fait cocu, par une petite larme d’artiste incompris. Quitte à passer pour un cœur de pierre ou une âme en peine qui n’a pas été touchée par la grâce de ce Road Salt One, je tiens quand même à vous préciser que cet opus m’a plongé dans un état de léthargie profond. Et je ne suis probablement pas un cas isolé. Alors oui, PAIN OF SALVATION a probablement pris un risque (inconsidéré ?) à produire quelque chose de totalement décalé et infidèle à leurs petites habitudes, mais le final est bien maigre pour le gros mangeur de riffs massifs et de vocaux gras que je suis. Ce fut pour moi comme d’aller voire une pute pour demander un câlin. Comme d’aller dans un macaron Michelin et de commander une feuille de batavia et une coupe de Perrier. Derrière ça, quelques compositions furent à la hauteur, non pas du répertoire, mais plutôt de l’époque contemporaine dans laquelle nous vivons. Je cite avec joie la quasi-parfaite et nostalgique « Sisters » et l’enchaînement entre la pétillante « Linoleum » et la rafraichissante « Curiosity » qui est de bonne facture. Pas assez pour me faire oublier cette déception immense, mais suffisamment peut-être, pour donner la moyenne à un CD qui possède ce « truc en plus » et que je vous conseille grandement. Pour la simple est bonne raison que la vie est faite d’expériences et que Road Salt One en est une très intéressante. Pour conclure sur une note positive, j’ai trouvé la voix de Daniel Gildenlöw d’une pure sensibilité et je ne pourrais que saluer la prestation du français Léo Margarit à la batterie, même si son rôle est limité.
Ne cherchez pas en Road Salt One le PAIN OF SALVATION des temps passés. Je ne sais pas si ce dernier est mort. Nous le saurons très prochainement, Road Salt One appelant logiquement un Road Salt Two que je me ferais un plaisir de découvrir, dans l’espérance d’être moins déçu et moins vite endormi que sur un effort, certes recherché et innovant, mais dramatiquement énigmatique.
Ajouté : Mardi 20 Juillet 2010 Chroniqueur : Stef. Score :    Lien en relation: Pain Of Salvation Website Hits: 12460
|