# 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
}
WHISPERING TALES (FRA) - Mechanism (2014)

Label : Auto-Production
Sortie du Scud : mai 2014
Pays : France
Genre : Metal symphonique mélodique
Type : Album
Playtime : 9 Titres - 62 Mins
WHISPERING TALES, un groupe marseillais de Metal Symphonique que l'on connaît bien chez Metal-Impact, pour s'en convaincre il suffit de relire dans nos colonnes les dernières chroniques, interview et live-report du combo.
Si vous avez prévu de ne prêter qu'une oreille distraite à cet album, comme ça en passant, je vous arrête tout de suite car c'est à nouveau, tout un univers que vous invite à découvrir WHISPERING TALES. Arrêtez le temps, pour mieux le remonter, le mécanisme de votre montre n'en souffrira pas, ni votre horloge biologique. Mechanism.
Véritable épopée musicale des années folles dans la cité phocéenne, à l'aube des années 20, dans une profusion de décors, épures de l'art Déco, de costumes chics mais encanaillés, clins d'œil racoleurs au surréalisme d'André Breton, de fumées de cigares Al Caponiens, de relents d'alcool frelaté, et d'odeurs de poudre au détour des quartiers, le colt sorti du holster. La voix de Joséphine Baker sur des rythmes de Charleston, en écho au Jazz des salles obscures, des cabarets des Roaring Twenties. Autant de références sur le zinc d'un comptoir auréolé de verres de whisky que de miettes de la madeleine de Proust dans la soucoupe d'une tasse de thé.
Le grattement d'un microsillon 78 tours, en écho aux années folles, introduit "Shattered", plantant le décor. Un flot d'énergie et de puissance qui annonce d'entrée la couleur et la volonté de WHISPERING TALES d'en découdre et de s'affirmer. L'heure de la maturité a sonné. Rythmique appuyée, et un chant omniprésent qui témoigne du gros travail effectué par Lucie sur son registre vocal. Les chœurs, sur plusieurs titres, donnent du relief, et ajoutent de la puissance au chant.
"To Come Full Circle" se révèle être le morceau le plus chargé en émotion, avec sa narration introductive chantée par Michel Bacci, relayée par Lucie avec son interprétation aux intonations martiales, fruits de l'écriture, du phrasé, de la scansion de Steph, sublimée par des orchestrations enlevées, pleines d'emphases. Jérémie y pose délicatement un solo, maitrisé et fluide. "Incomplete", un morceau tourbillon, réunissant tous les ingrédients du genre, témoignant d'une parfaite cohésion du groupe, exécution parfaite, maitrisée, du Metal symphonique de qualité, avec ses quelques notes de piano qui apportent une légèreté, celle d'une ode bucolique.
Mais la clé de voute, la pierre angulaire, de cet édifice est, sans aucun doute, le titre "The Code", il résonne à nos tympans comme une évidence, avec un growler qui s'invite confirmant la parenté avec EPICA, DELAIN et son dernier album The Human Contradiction, une thématique que ne renierait pas Steph. Ce Code, digital, est la clé d'une martingale gagnante et d'un nouvel horizon musical.
Les morceaux ont chacun leur illustration sonore, comme " Tempus Fugit" qui égrène le temps comme autant de grains de sable grippant le mécanisme, parodie des temps modernes, laissant libre cours aux soli de Jérémie, avec les nappes sonores et ondulées de Stéphanie. "The Descartes Syndrome" est dans la même lignée avec des orchestrations omniprésentes, aidé par une production efficace, donnant du relief à l'ensemble. On retrouve aussi un Bruno, aux drums, régulier comme un métronome.
"To Die A Second Time" se décline sur un mode mid tempo, avec un chant plus lancinant et entêtant, il convient en effet de s'économiser quand, à l'insu de son plein gré, on s'aperçoit que l'on meure pour la deuxième fois !
"La Garde" vient compléter le puzzle d'une histoire et d'un concept fécondés par Steph Castelli, avec l'implication du toujours discret Rémi Ruffe (il est recherché par la police ou quoi ?), titre avec des notes Heavy, et ce qu'il faut d'émotions quand il est l'heure de se quitter... sur quelques notes de piano.
Mesdames, et Messieurs de WHISPERING TALES, chapeau bas !
Ajouté : Samedi 26 Juillet 2014 Chroniqueur : Le Patriarche Score :     Lien en relation: Whispering Tales Website Hits: 11158
|