# 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
}
TRISTANIA (no) - World of Glass (2001)

Label : Napalm Records
Sortie du Scud : 25 septembre 2001
Pays : Norvège
Genre : Metal Gothique
Type : Norvège
Playtime : 9 Titres - 55 Mins
Le 3e ange sonna de la trompette. Et il tomba du ciel une grande étoile ardente comme un flambeau ; et elle tomba sur le tiers des fleuves et sur les sources des eaux. Le nom de cette étoile est Absinthe ; et le tiers des eaux fut changé en absinthe, et beaucoup d'hommes moururent par les eaux parce qu'elles étaient devenues amères. [Apo. 8 :10-11.]
World of Glass, le troisième opus de TRISTANIA, est aussi grisant qu'une première gorgée de cette absinthe qui, sous couvert de l'univers apocalyptique qui l'anime, a donné son nom à l'un des titres phare de l'album ("Wormwood"). Hanté par le thème de la transcendance et ses résonances bibliques, World of Glass porte ainsi aux nues cet imaginaire de l'évanescence qui fait tout le charme de la musique gothique. Non content de prendre dignement le relais de Beyond the Veil, œuvre parfaitement aboutie qui consacra le groupe norvégien sur la scène Goth, le troisième album de la bande nouvellement emmenée par Einar Moen (clavier et composition) après le départ de Morten Veland (parti fonder SIRENIA) est fort d'une musicalité remarquable.
Du point de vue instrumental, basse, batterie et guitare s'accordent sans se déborder sur une rythmique énergique, soutenue par un clavier qui, sans jamais s'imposer, laisse s'envoler la mélodie ; surtout, les violons de Pete Johansen (THE SINS OF THY BELOVED) confèrent à un morceau aussi fin que "Deadlocked" cette tonalité si particulière, faite d'une mélancolie tour à tour froide et aérienne. Sur cette base solide malgré l'impression de fragilité doucereuse qui s'en dégage, aux voix respectivement Death et Black de Ronny Thorsen et du guitariste Anders H. Hidle, répondent le chant clair d'Østen Bergøy et de Jan Kenneth Barkved, au-dessus desquelles planent, avec une douceur d'outre-tombe, les vibrations cristallines de Vibeke Stene. Les voix s'équilibrent ainsi et se rencontrent en toute harmonie, parfois renforcées par des chœurs puissants ("Wormwood", "Wold of Glass") ; mais c'est peut-être dans "Tender trip on earth" qu'elles trouvent l'accord parfait, au fil d'un morceau aussi rythmé que mélancolique, dans lequel voix claires et voix Black se superposent jusqu'à fusionner dans un style aussi traînant que pénétrant.
Le seul reproche que l'on puisse formuler à l'encontre de cet album réside peut-être, précisément, dans cette fascinante variété qui frise cependant avec le manque d'homogénéité. Si l'unité de ton faisait clairement la force des deux premiers albums, Widow's Weeds se distinguant par la cohérence de son architecture tandis que Beyond the Veil brille par son équilibre et par son unisson, World of Glass procède davantage, comme Illumination à sa suite, d'une juxtaposition de morceaux intenses qui semblent déliés les uns des autres. Les titres pleinement gothiques comme "The Shining Path" ou "Deadlocked" cohabitent avec des morceaux d'ambiance sans véritable relief (tels que "Hatred Grows" ou "Crushed Dreams") ainsi qu'avec des titres à forte charge émotionnelle comme l'excellent "Tender trip on earth". Mais surtout, à côté d'un monument tel que "Wormwood" (vraie belle absinthe à boire cul sec sans hésitation), les notes électro de "Lost", qui visent probablement à renforcer l'esprit éthéré et enivrant de l'ensemble, installent une forme de discordance qui, au final, fait soudain sortir l'auditeur de l'atmosphère confortable dans laquelle l'avait plongé des morceaux graves et vigoureux. D'ailleurs, il n'est peut-être pas anodin de remarquer que le titre éponyme "World of Glass" incarne précisément ce décalage, avec ses rythmes efficaces et cette énergie qui porte loin, malheureusement desservis par une intro quelque peu décalée.
Malgré ces quelques semblants de fausses notes, World of Glass reste un très bel ouvrage gothique, robuste et planant à la fois, dont il semble difficile de pouvoir un jour se lasser. Incontestablement, le troisième opus de TRISTANIA nous éclate aux oreilles comme un verre brisé ; à la fois fragile et tranchant, fragmentaire et affuté, il est aussi surprenant qu'un miroir décomposé dont on voudrait briser la glace pour en saisir toute la quintessence.
Bref, une absinthe comme celle-là, on en reprendrait bien un coup.
Ajouté : Mardi 10 Mars 2015 Chroniqueur : Istaria Score :     Lien en relation: Tristania Website Hits: 7744
|