# 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
}
GRINNING SHADOWS (it) - The New Curse (2010)

Label : Auto-Production
Sortie du Scud : 20 mars 2010
Pays : Italie
Genre : Gothic Black Metal
Type : EP
Playtime : 5 Titres - 30 Mins
Une fois de plus, les italiens font les choses dans la dentelle. Aujourd’hui, ce sont les GRINNING SHADOWS, un six pièces lombard, qui nous propose son deuxième EP, The New Curse dans un magnifique digipack au design épuré. Seulement, il y a bien longtemps que j’ai appris à me méfier du contenu de ces superbes coffrets, innocemment envoyés aux webzines pour une promo déjà tronquée par ce seul fait. Je ne connaissais ce combo ni d’Eve, ni d’Adam malgré l’intérêt tout particulier que je porte pour la scène italienne mais je n’ai pas mis longtemps à m’accommoder au charmant minois de leur frontwoman, Silvia Rigoni. Pour ce qui est de leur musique, ce fut une affaire un peu plus délicate. Des membres originaires d’un pays où la tradition gothique est bien ancrée, de belles lettrines sur leur logo, des photos faites dans un château aux mobiliers très rococo, une belle chanteuse entourée de cinq poilus, ça vous inspire ? Moi aussi. Mais rien qui vaille.
Evidemment, car le Gothic Metal est un style qui a perdu de son aura au cours de ces dernières années, avec notamment l’incroyable désistement des WITHIN TEMPTATION, les hésitations successives de Liv Kristine, la dernière cagade de DELAIN ou les atermoiements répétitifs de LUNATICA. Pour autant, GRINNING SHADOWS n’est pas vraiment à classer avec ces quelques (ex-)références, leur musique à eux étant beaucoup plus sombre et affiliée au Black Metal. Ce cinq-titres, entièrement autoproduit, entraine l’auditeur dans une lutte introspective avec son propre Moi. C’est du moins ce que j’en ai compris, mais sans tirer de réelles conclusions sur mon compte. C’est plutôt sur le leur qu’il est facile d’en tirer, car GRINNING SHADOWS qui affiche une bonne volonté à toute épreuve n’arrive pas à la cheville de ses muses. Il leur manque un pygmalion pour propulser ces compositions dans les hautes-sphères. Pour un groupe de Gothic Metal, j’ai trouvé les claviers foutrement en-dedans. Ou du moins pas aussi impériaux qu’ils se doivent d’être. Quelques accords de piano ça et là, c’est assez famélique comme bilan. La seule et unique guitare, tenue par Simone Cirani, ne suffit décidemment pas si on choisit de faire des riffs épiques, il lui faut impérativement un alter-ego pour exploiter les bonnes idées entraperçues sur le final de « Missing » par exemple. Coincée entre Black et Gothic, sa riffothèque m’apparaît bien pauvre et les mélodies larmoyantes sur les parties reposantes typiques n’ont aucune accroche. Devant, le duo de chanteurs Mario-Silvia est complètement à la masse. Le premier, qui officie dans un registre chanté-hurlé à la limite du supportable, a d’énormes problèmes de justesse. La deuxième n’a simplement pas cette voix cristalline et pénétrante, nécessaire pour faire ce job, son timbre se rapprochant plus de Bonnie Tyler que de Simone Simmons. Heureusement, Simone (le guitariste) pose quelques growls bien sentis épisodiquement, ce qui soulage nos petites oreilles. Bon, sans exagérer, écouter GRINNING SHADOWS c’est largement supportable, sauf que le niveau est encore très amateur. Néanmoins, ils ne sont pas tombés dans la facilité en faisant du remplissage et en nous gavant des gros poncifs du style. Leur jeu demeure varié, tant au niveau des ambiances que des tempos et c’est quelque chose de positif. Enfin, relativisons un peu ! Ce n’est qu’un EP et ça n’engage encore à rien.
Seulement voilà, pour un groupe qui est actif depuis 2003, j’ai bien peur que la marge de progression soit sérieusement entamée. Cet enregistrement n’a rien de mémorable, il s’écoutera, avec quelques grimaces parfois et retournera sagement se ranger dans la discothèque. On le ressortira pour le plaisir des yeux uniquement. Et pour des musiciens, ce n’est pas vraiment le plus beau compliment que je puisse leur adresser.
Ajouté : Mercredi 27 Juillet 2011 Chroniqueur : Stef. Score :   Lien en relation: Grinning Shadows Website Hits: 10366
|