# 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
}
LES DISCRETS (FRA) - Septembre Et Ses Dernières Pensées (2010)
Label : Prophecy Productions
Sortie du Scud : 29 mars 2010
Pays : France
Genre : Metal Atmosphérique / Shoegaze
Type : Album
Playtime : 10 Titres - 43 Mins
Lorsqu'on constate que la culture du Metal n'est pas très médiatisée dans nos contrées, on se rend très vite compte que ce n'est finalement pas plus mal. Surtout quand on voit le monceau de conneries que peut débiter notre chère télévision. Et pourtant, les productions locales intéressantes ne manquent pas ! Et vous aurez très vite compris que LES DISCRETS font partie de cette catégorie. Formés en 2003, nos Lyonnais se sont très vite fait remarquer, notamment avec la naissance d'un split avec ALCEST en 2009 qui a contribué à faire grandir leur renommée. Puis vint ce Septembre Et Ses Dernières Pensées en 2010, premier opus de la formation.
Après une introduction enivrante, les guitares nous plantent leur mélancolie, telle une pierre noire venant s'imposer sur un terrain vague. Une fois que quelques phrases mélodiques viennent ponctuer le tout, il ne manque plus que le magnifique chant brumeux de Fursy Teyssier pour nous faire basculer dans un monde poétique à souhait. Nous poursuivons sur ces sentiers tapissés de feuilles mortes et tombons sur un "Song For Mountains" qui selon moi, est le morceau le plus complet de l'album, car commençant par un petit arpège à l'acoustique du plus bel effet, embrayant sur une douce montée de tristesse pour retomber sur un break atmosphérique. Vous aurez compris qu'avec un tel départ, LES DISCRETS n'ont eu aucune difficulté à nous faire voyager. Et pourtant, il n'en aura pas fallu beaucoup ! Il suffit d'un tempo lent et bien amené ainsi qu'une pointe de mélodie, le tout exécuté avec finesse et discrétion. Cela vous semble impossible ? Écoutez donc "Sur Les Quais". Avec en complément la magnifique voix d'Audrey Hadorn, cette piste acoustique vous fera rêver dès ses premières notes. Mais le voyage dans la nature n'est certainement pas terminé ! Nos Lyonnais deviennent plus virulents avec "Effet De Nuit", la piste sortant le plus du lot sous ses sonorités assez Black Metal dans le fond, mais qui reste de très bonne qualité, l'un n'empêchant pas l'autre me direz-vous. Une fois passé le doux vent éponyme, nous tombons sur le morceau de plus long de l'album, "Chanson D'Automne". Le chant de Fursy est ici à son apogée, et les guitares s'écrasent sur le sol telles les vagues se brisant sur les rochers. Nous relevons la tête, et nous constatons que l'introspection est bientôt terminée. C'est en tout cas ce que nous dit l'instrumentale "Svipdagr & Freyja". On termine la galette par "Une Matinée", titre peu commun pour boucler la rondelle mais voulu, sans l'ombre d'un doute. Car les saisons ne sont-elles pas qu'un éternel recommencement ? Tout comme la vie ? En tout cas, ce titre a tout du final réussi ! Après une prestation pareille, je n'en attendais pas moins d'eux. Et l'automne se termina. Il fut court. Très court. Mais de tous, ce fût le plus merveilleux.
Et quand bien même la communauté métalleuse se fait pointer du doigt et désigner comme une "horde de gothiques sanguinaires", qu'est-ce que cela peut bien faire ? Au final, a-t-elle quelque chose à prouver ? Non. Mais avec une galette pareille, j'en connais plus d'un à qui cela fermerait le clapet. Au final, laissons donc les abrutisseurs de masses gaver le cerveau des jolies têtes blondes que nous ne sommes pas. Pour en revenir à l'album, si vous êtes encore en train de chercher ses défauts dans cette chronique, j'ai catégoriquement refusé d'en trouver. Pourquoi ? Parce que LES DISCRETS est une formation qui ne s'est pas mise à suivre bêtement un mouvement où à rentrer dans un quelconque moule. Et même en tentant d'être sadique, je n'aurais pas trouvé grand-chose pour assouvir mes désirs de petit saligaud. En 2010, LES DISCRETS étaient trois à exprimer purement et simplement leurs sentiments et leur passion à travers une bande-sonore qui n'a cessé de m'envoûter, et ce jusqu'à la dernière seconde. Tout est dit.
Ajouté : Dimanche 15 Septembre 2013 Chroniqueur : Nash Score : Lien en relation: Les Discrets Website Hits: 6858
|