# 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
}
MEKONG DELTA (de) - Wanderer On The Ege Of Time (2010)
Label : Zardoz Media UGh / Aaarrg Records
Sortie du Scud : 11 juin 2010
Pays : Allemagne
Genre : Symphonie Classico-Thrash de haute volée
Type : Album
Playtime : 15 Titres - 50 Mins
Trois ans après Lurking Fear, Ralf Hubert décide de continuer tant bien que mal l’aventure MEKONG DELTA, commencée au milieu des années 80, et à l’écoute de ce Wanderer On The Ege Of Time, on ne peut que l’en féliciter.
Si Lurking Fear sentait la transition et le retour plein de précautions à plein nez, les ambitions sont franchement déclarées en 2010, et le géant de l’ombre est bien décidé à retrouver les fastes d’antan. Si la production de Wanderer n’a rien d’étouffée, contrairement aux chef d’œuvres « classiques » du groupe, et reste très actuelle, elle n’a rien d’up in time…Impossible à l’écoute de cette œuvre de la dater, et c’est bien évidemment ce qui fait le charme du groupe. Même si Ralf n’est pas imperméable aux tendances actuelles, il mène sa barque comme bon lui semble, toujours obsédé par le Néo classique russe du 19ème, autant que par les structures du Thrash européen contemporain.
A cheval entre les débordements du symphonique et la puissance du Metal, on peut dire qu’enfin, l’osmose parfaite a été atteinte.
Aussi proche de Dances Of Death que de The Principle Of Doubt, le quintette réussit le tour de force de se retourner sur son passé, sans être passéiste, et tout en regardant vers l’avenir les yeux grands ouverts.
Mais Wanderer est difficile d’approche, inutile de le nier. Si les fans de progressif seront séduits à force d’écoutes, les autres risqueront de le trouver un peu hermétique. Rien de bien nouveau me direz vous, puisque c’est une constante chez MEKONG DELTA, qui refuse la musique fast-food, sitôt écoutée, sitôt digérée.
Et s’il est décomposé une fois de plus en de nombreuses parties, il reste d’une homogénéité flagrante, qui le confine à la magie. Plus qu’une bande son onirique, c’est à un voyage intérieur auquel nous sommes conviés, ce que nous acceptons de bonne grâce, ou que nous refusons de peur de nous retrouver face à nous même.
C’est toute la complexité de l’existence qui est étalée ici, et il faut une bonne dose d’abnégation pour en accepter les tenants et aboutissants.
Et finalement, c’est du conte humain que se rapproche le plus cet album, et il conviendrait de le ranger en bonne place, aux côtés d’un The Music Of Erich Zann qui en avait laissé plus d’un sur le carreau de l’analyse écrite.
De la splendide et délicate intro « Concert Guitar », toute en subtilités harmoniques, jusqu’au final fortement imprégné de rugosité Thrash, il y a plus d’un pas à franchir.
Il faudra en passer par une multitude d’ambiances maîtrisées à l’extrême. Pour n’en citer que quelques une, je parlerai de la douceur hypnotique de « Affection ( L' Amoureux ), Movement 6 », subtile comme du Neal Morse, du Proto-Thrash « Intermezzo ( Instrumental ), Movement 5 », qui nous ramène aux grandes heures du groupe, lorsque ses membres se voyaient obligés de démontrer sur une portée toute la clarté de leurs compositions absconses, et bien sur, l’énorme « The 5th Element ( Le Bateleur ), Movement 2 », aussi indispensable et novateur qu’un échange de propos entre DREAM THEATER et VOÏVOD.
Et c’est justement de ces premiers dont MEKONG DELTA se rapproche le plus.
Il n’est pas inconcevable de percevoir Wanderer On The Edge Of Time comme le pendant mystique de Metropolis 2000. Même capacité instrumentale, même dévotion face à la hiérarchisation des couches rythmiques et mélodiques, même sentiment de dépassement de soi au final.
La musique de MEKONG évolue telle une vague qui se brise avant de se reconstruire au loin pour surprendre le nageur. Et l’emporter dans un tourbillon de doute, d’effroi, de quiétude et d’inconnu.
Sensation inédite certes, pas forcément agréable au prime abord, mais terriblement formatrice, permettant ainsi l’appréhension de la musique moderne au moyen des sentiments les plus bruts.
On peut être effrayé par un miroir déformant, distordant la réalité au point de la travestir irrémédiablement. Mais quand le miroir se brise, on se retrouve seul face à son Ego, qu’on n’a même pas la chance de pouvoir illustrer concrètement.
Il faut donc puiser au fond de soi pour en ressortir grandi ou anéanti.
Et finir par errer, sur les rivages du temps.
Ajouté : Lundi 20 Septembre 2010 Chroniqueur : Mortne2001 Score : Lien en relation: Mekong Delta Website Hits: 9128
|