# 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
}
HOLDING SAND (FRA) - A Life Worth Memoirs (2015)
Label : Auto-Production
Sortie du Scud : 20 février 2015
Pays : France
Genre : Post Hardcore
Type : Album
Playtime : 12 Titres - 54 Mins
Les concept album, c'est bien parce qu'ils racontent une histoire. L'artiste nous donne une notice ou pour le moins, un chemin de lecture de son travail. Et quand en plus il pousse le perfectionnisme jusqu'à réaliser une série de trois clips et un making-off video, il nous donne vraiment toutes les clés pour apprécier la musique sans barrières ni retenue. Alors quand j'ai appris que le deuxième effort des tourangeaux de HOLDING SAND contenait tous ces ingrédients, je me suis frotté les mains de contentement.
Le combo se présente comme pratiquant un Post Hardcore. Mais vu qu'ils n'ont pas grand chose à voir avec l'éthique de ce courant, je préfère décrire leur travail comme du Metal Alternatif. C'est une musique Heavy, riche et très écrite sur laquelle le talentueux chanteur, Clément Horvath, balance un chant brut, tantôt clair et tantôt hurlé en adaptant sa voix à la musique de ses complices, à la manière de Vincent Peignart-Mancini avec AqME. L'alchimie est parfaite et comme le groupe a fait appel à des pros pour la prod et le mastering de tous ses opus, le résultat final est très propre.
Le projet A life Worth Memoirs occupe les tourangeaux depuis mi-2012.
En adoptant une approche différente, HOLDING SAND a voulu sortir de sa zone de confort. Imaginer une histoire, penser les compos en cohérence avec la narration. Adapter la musique à l'histoire et les lyrics à la musique. Et quand le projet a été suffisamment mûri et pré-produit, s'enfermer pendant quinze jours au studio Sainte-Marthe avec le producteur Francis Caste (HANGMAN'S CHAIR, BUKOWSKI, KLONE).
Le résultat est à la hauteur des espérances : un mur de son brut, un son authentique, une voix écorchée. Clément (chant) explique que "c'est l'histoire d'un personnage arrogant, obsédé par la réussite qui va mourir à petit feu des conséquences de ses différents vices pour réaliser après sa mort que la Terre tourne bien sans lui, qu'il n'a pas laissé sa trace, qu'il a servi à rien. Du coup la question se pose de comment faire en sorte que sa vie compte, qu'elle ait réellement du sens. Même si l'histoire est plutôt sombre, le message final est positif: profiter des siens, de ceux qui nous entourent parce qu'on a qu'une vie et il faut faire le maximum avec ce qu'on a".
La narration est découpée en trois chapitres de quatre morceaux : la vie et la prise de conscience, la maladie et la déchéance, la mort et après. A Life Worht Memoirs suit une trame musicale decrescendo similaire à celle du film Irréversible de Gaspar Noé. Une ouverture sur un Metal très violent et agressif, porté par un chant hurlé à la limite du growl. Une deuxième partie où la musique puissante se pose peu à peu avec ici et là des sursauts de hargne et de désespoir. Enfin, un dernier tiers plus atmosphérique et mélodique où Clément adopte le chant clair tandis l'instrumentation ralentit le tempo et lisse ses effets.
Un morceau comme "Denial, Anger, Bargaining, Depression, Acceptance" qui fait la charnière entre le deuxième et le troisième mouvement illustre bien ce travail sur les ambiances. La chanson s'ouvre avec une mélodie plutôt posée sur laquelle Clément tisse des couplets hurlés et des refrains en chant clair. Après une longue phase instrumentale, le chanteur explose dans un dernier sursaut désespéré avant de se rendre à l'évidence et d'accepter l'issue fatale.
Cette présentation évolutive met en lumière le travail des artistes et fait ressortir la capacité du collectif à sortir autre chose que des power chord et du gros son gras sans pour autant quitter l'univers Metal. Avec cet exercice de style, HOLDING SAND démontre son talent en déployant un éventail musical large et varié. Le concept album donne à l'ensemble un fil conducteur. C'est un travail réfléchi qui s'écoute avec une double couche de plaisir. La première pour apprécier la qualité remarquable du produit et la deuxième pour découvrir la façon dont chaque musicien nous racontent leur histoire. S'il y a une histoire dont on a en tout cas envie de connaître la suite, c'est celle du groupe HOLDING SAND.
Ajouté : Vendredi 20 Mars 2015 Chroniqueur : Rivax Score : Lien en relation: Holding Sand Website Hits: 5576
|