# 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
}
DREAMCATCHER (FRA) - Emerging From The Shadows (2012)
Label : Brennus Music
Sortie du Scud : avril 2012
Pays : France
Genre : Heavy Metal
Type : Album
Playtime : 10 Titres - 43 Mins
Sortir un disque de Heavy Metal mélodique en 2012, c’est ce qui s’appelle avoir des couilles au cul. Pourtant, pour DREAMCATCHER, ça ressemble davantage à un acte citoyen qu’à un pari fou. Structuré autour de Chris Garrel en 2001, le groupe trouve la quiétude en 2008, lorsque le line-up se stabilise. Il faudra attendre encore quatre années avant la parution d’un premier effort, si l’on excepte l’anecdotique EP éponyme de 2006. La grande chance de ce combo parisien, c’est qu’il semble complètement coupé des avis extérieurs. Et nombreux sont ceux qui ont dû clamer haut et fort leur incompréhension de voir naître un pareil projet en 2012, plus de dix ans après sa création. A l’heure où la scène Metal regarde de plus en plus vers l’avenir, DREAMCATCHER pose un regard attendri sur le Heavy des années 80, et effectue avec Emerging From The Shadows un bond de plusieurs décennies en arrière.
Dire que ce premier opus s’adresse principalement aux nostalgiques de la grande époque du Heavy est une évidence. Malgré ça, il est également susceptible d’intéresser les plus jeunes d’entre nous, particulièrement ceux qui souhaitent savoir à quoi ressemblait le quotidien de leurs ainés. QUEENSRYCHE, ARMORED SAINT, HADES, SANCTUARY sont quelques noms qui n’évoquent pas grand-chose aux oreilles de la nouvelle génération. Pourtant, on les retrouve tous dans cet album. Ils sont guidés par sa Sainteté IRON MAIDEN dont l’esprit plane en permanence au-dessus de ces quelques compositions. N’allez pas croire pour autant que DREAMCATCHER s’enferme dans ses sources d’inspiration. Bizarrement, on trouve également des éléments plus contemporains dans ce Heavy de relative bonne facture. Outre une production très soignée qui facilite le transport de l’auditeur vers le monde des rêves, il y a un riffing ostensiblement Thrash, un peu à la ICED EARTH et un jeu de batterie beaucoup plus moderne et novateur qu’à l’accoutumée pour le style, d’inspiration groove-tribal. De petites spécificités qui n’enlèvent en rien le côté authentique d’une œuvre s’appuyant en permanence sur des chevauchées de guitares épiques. Tout autre choix aurait d’ailleurs été surprenant. Mais ce qui retient incontestablement l’attention sur chaque disque de Heavy Metal, c’est la performance du chanteur. Ici, Chris Garrel déploie ses cordes vocales, pas forcément de la façon la plus égale qui soit à cause notamment d’un anglais un peu caricatural, mais avec puissance et avec une gratitude non-dissimulée pour l’influence qu’à eu Bruce Dickinson sur sa propre carrière de vocaliste. L’hommage, timidement masqué par différentes mimiques, fait plutôt plaisir à entendre. Qui n’a pas un jour rêvé de pouvoir embrasser un pareil destin ? Globalement équilibré avec des temps forts (le tube « People Of Darkness », la balade « How Much I Miss You ») et des temps faibles (le mollasson « Fire & Ice », la reprise acoustique d’« How Much I Miss You » qui brise son élan romantique), Emerging From The Shadows, s’il demeure un peu léger dans son ensemble, n’en est pas moins un premier essai que beaucoup auraient aimé écrire de pareille manière.
On n’aura certainement pas de souvenirs impérissables à l’issue de cette expérience, mais au moins quelques flashbacks. C’était une époque où le paradis pouvait attendre. Souvenez-vous, Bruce Dickinson en avait lui-même donné l’ordre. DREAMCATCHER peut donc être fier de son coup. Tout n’est pas parfait, mais les français sont loin d’être ridicules avec leur petit album de Heavy à l’ancienne qui sera probablement dévisagé comme un obèse à la Fashion Week mais écouté avec pas mal d’intérêt.
Ajouté : Mercredi 23 Mai 2012 Chroniqueur : Stef. Score : Lien en relation: Dreamcatcher Website Hits: 8126
|