# 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
}
THE GREY CURTAIN (usa) - Shadow Of A Man (2016)
Label : Auto-Production
Sortie du Scud : 21 octobre 2016
Pays : Etats-Unis
Genre : Power Metal
Type : Album
Playtime : 10 Titres - 48 Mins
Il y a un genre qui tombe quelque peu en désuétude, c'est le Power Metal. D'abord parce que le côté théâtral et symphonique se développe dans d'autres courants. D'autre part, parce que les bons vocalistes, ceux qui ont vraiment appris à chanter et savent moduler leur voix comme Ian Gillian, Bruce Dickinson ou Ronnie James Dio sont plutôt rares. Oh, bien sûr, on en trouve dans les formations reconnues, mais c'est tout de même moins fréquent dans les groupes émergents. Souvent, les projets de Power Metal autoproduits sont patauds, tirant un peu trop sur le lacrymal, les trémolos et les vocalises d'opérette.
Ce n'est pas le cas de THE GREY CURTAIN, projet américain sorti de nulle part dont le debut album, Shadow Of A Man emprunte le chemin casse-gueule du concept album. Certes, le concept album offre un support de rêve au Power Metal, mais pour un premier projet, se créer la contrainte supplémentaire d'une histoire à raconter sur dix chansons, c'est un pari très osé.
Pourtant, THE GREY CURTAIN évite à la fois les pièges du Power Metal et du concept album en livrant un concept album de Power Metal extrêmement brillant.
Comme je l'ai dit plus haut, THE GREY CURTAIN est un quintet fondé en 2014 et composé d'un chanteur / bassiste acoustique (Dennis Leighton), d'un clavier (James Miller), d'un batteur (Sean Daudelin), d'un bassiste (Robert Miller) et d'un guitariste (Dan Whiteknact). Pour le moment, la formation n'a pas une immense histoire à nous proposer. Aucune chronique publiée à ce jour, quelques photographies de concert partagées sur leur page facebook, pas vraiment de biographie sinon les quelques lignes présentes sur Reverbnation. On y apprend que le gang est originaire de Worcester, Massachussett et qu'il est influencé par PEARL JAM, A PERFECT CIRCLE, PINK FLOYD, TYPE O NEGATIVE, NIN et TOOL. Enfin, la courte bio nous révèle que le groupe s'est fait remarquer par ses performances live chargées d'émotion. Bref, une bio de groupe de Metal on ne peut plus classique et cliché.
La partie la plus révélatrice de cette présentation est celle consacrée à l'explication du choix du nom du groupe. Les personnes victimes d'un détachement de la rétine ont décrit la sensation comme "un rideau gris qui tombe" ou une ombre qui se déploie devant leur champ de vision. De la même manière, la dépression et le désespoir qu'on peut expérimenter en tant qu'être humain peuvent être décrits de cette manière : "No colour left, juste shades of grey, when the ray of life starts to decay, I'm a shadow of a man" (extrait de la chanson "The Bleeder"). Ce rideau n'a pas besoin d'être opaque, comme le personnage de Frodon le fait remarquer à la toute fin du Seigneur des Anneaux, "And then it seemed to him that as in his dream in the house of Bombadil, the grey rain-curtain turned all to silver glass and was rolled back, and he beheld white shores and beyond them a far green country under a swift sunrise".
Musicalement parlant, il n'est pas indispensable de suivre l'histoire de Shadow Of A Man pour entrer dans le disque. La musique variée et le chant proposent un fil conducteur qui se suffit à lui même. Guitares lumineuses, riffs audacieux, nappes de clavier enjouées tissent une trame heureuse servant de toile de fonds enluminé au chant. Celui-ci évite le piège du larmoyant à outrance. Certes Dennis Leighton sait chanter, mais il n'en abuse pas, dosant ses efforts et ménageant ses effets. Le résultat est un album bien équilibré, entre morceaux épiques et majestueux, balades plus contemplatives et phases instrumentales envoûtantes.
Théâtral à souhait, bourré de charme et exempt de défauts rédhibitoires, Shadow Of A Man est un bon disque à découvrir, pour les fans de Power Metal, bien sûr, mais aussi pour tous les amateurs de musique bien foutue et audacieuse.
Ajouté : Dimanche 30 Avril 2017 Chroniqueur : Rivax Score : Lien en relation: The Grey Curtain Website Hits: 5202
|