# 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
}
NEMOST (FRA) - As The Ocean Burns (2014)
Label : Dooweet Records
Sortie du Scud : 15 mai 2014
Pays : France
Genre : Death Metal mélodique progressif
Type : Album
Playtime : 12 Titres - 65 Mins
Lorsque la motivation n'est pas au goût du jour et que l'écoute ne donne plus envie d'écrire, il faut se ressaisir au plus vite ! C'est dans cette optique que j'ai décidé d'entamer ce début d'année 2015. NEMOST. C'est donc ce groupe parisien qui va être cuisiné. Je dois bien avouer que dès le premier regard, j'ai été plus que séduit par la formation. Cover écarlate fort sympathique, logo propre et professionnel, étiquette Death mélodique sur la tête, miam ! Allez, je me lance ! De toute évidence, cela ne pourra que me faire du bien en ces temps de trouble et de folie. Et j'ai comme l'intuition que mes oreilles vont se dresser un bon paquet de fois sur ce As The Ocean Burns sorti en 2014.
Je préfère mettre les choses au clair d'entrée : il va être très difficile pour moi de retenir mon enthousiasme face à cette production. Car cet album, est tout ce qui a de plus travaillé et recherché. Les pistes sont accessibles sans être simplistes, et la variété est de la partie. J'en est pour preuve "Beasts And Bullies" avec son entrée Black/Death dévastatrice, puis son solo bien mélodique vers le milieu, ce qui offre une palette auditive tout simplement délicieuse en l'espace d'un morceau seulement.
A ceux qui pensaient que ce n'était là que la magie des premières pistes, grossière erreur ! Plus nous avançons dans l'album et plus le talent de NEMOST se dévoile et nous transporte dans un monde somptueux. Le vocaliste dispose d'un timbre plutôt spectral au niveau des growls, et se débrouille comme un chef pour les esquisses Black Metal ("Fight"). Quoi qu'il en soit, il m'est tout bonnement impossible de vous citer les pistes qui ont retenue mon attention, car c'est bel et bien la totalité de cette galette qui m'a envoûté.
La batterie déferle avec brio tandis que les guitares s'érigent telle des barrières pourpres infranchissables. Parfois elles se taisent pour laisser place à des parties d'acoustiques planantes ("The Aimless Endeavour"), ou bien pour partir dans des phases mélodiques à tomber par terre ("Lifeless Heat" et son final bon sang...). Ajoutez à cela des influences à la OPETH, et vous obtenez ce qui se fait de meilleur en matière de Death mélodique et progressif dans l'hexagone.
Et la cerise sur le gâteau ? Cette merveille dure 1 heure ! Autant vous dire que les gaillards n'aiment pas laisser l'auditeur sur sa faim, et ils le font comprendre ! Alors oui je sais, on pourra toujours dire qu'objectivement, il est ceci, il est cela, et puis ? Pour une fois, est-ce que nous pouvons faire abstraction de ce genre de chose pour se concentrer sur la musique ? La vraie ? Ce que je vois ici, c'est un groupe cohérent, soudé, qui sait où et comment avancer tout en faisant preuve d'une inspiration sans faille. Vous pourrez en dire ce que vous voulez, mais admettez quand même que la chose se fait de plus en plus rare à dénicher.
En ce qui me concerne, je suis las. Las d'essayer de trouver en vain un adjectif sur mon ressenti. las de buter sur chaque mots pour écrire ce fichu papier, et surtout, las d'essayer de trouver des défauts à cet album. As The Ocean Burns sort clairement du lot de part sa finition et le soin qui lui a été apporté.
Inutile donc de se cacher, NEMOST a su me séduire et a attiré mon attention sur une scène dont je m'intéressais à peine. Eh bien j'ai eu tort. Car j'ai comme l'impression qu'elle est pleine de ressource et est loin d'être usée. En tout cas, je peux vous dire que des productions telles que As The Ocean Burns vous redonnent la patate en un rien de temps !
Ajouté : Jeudi 12 Février 2015 Chroniqueur : Nash Score : Lien en relation: Nemost Website Hits: 5824
|