# 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
}
KHONSU (no) - Traveller (2014)
Label : Auto-Production
Sortie du Scud : 22 Mars 2014
Pays : Norvège
Genre : Progressive Black Metal
Type : EP
Playtime : 5 Titres - 26 Mins
La Norvège, ses vocables imprononçables, ses musiciens affables et plein d'empathie, ses fjords hauts en couleurs et qui réchauffent les corps. Halte aux lieux communs. Certes, la Norvège n'est pas l'emblème d'un exotisme torride, mais qu'importe, elle nous a offert certains des courants musicaux les plus fascinants, et continue en 2015 d'abreuver nos conduits auditifs de confiseries de l'âme, aussi acides qu'hallucinogènes.
Qu'en est-il aujourd'hui ?
Aujourd'hui, nous nous rendrons à Trondheim je vous prie, pour aller à la rencontre de noms fameux, tout du moins pour les fans de KEEP OF KALESSIN. Mais si l'on retrouve au casting de KHONSU des habitués, ça n'est pas pour autant que leurs choix sont les mêmes et immuables d'un projet à l'autre.
Certes, nous définirons les inclinaisons de S. Gronbech comme partie intégrante du mouvement Black, mais en apportant la précision Indus qui découle de sa musique. Black certes, mais à la MAYHEM de Grand Declaration, puissant, maléfique, froid, clinique et relativement humain dans son approche glaciale de la violence.
Mon collègue CyberIF. avait trempé sa plume dans l'enthousiasme lors de sa chronique d'Anomalia il y a trois ans. Je ne tempèrerai pas ses ardeurs ici, mais les partagerai, même si mon travail fut certainement plus simple que le sien. Et puisque Traveller reste un EP (quoique sa durée atteigne sans problème celle d'un LP un peu radin), je choisirai bien mes mots pour ne pas gloser des heures et perdre de l'impact nécessaire à l'analyse de ces quatre/cinq titres. Sur cinq morceaux au total, trois peuvent être considérés comme tels. Si l'on excepte l'intro, plaisante mais transitoire, l'affaire débute violemment par "IX", sommet de Black cybernétique qui ne fait aucun cas d'une empathie quelconque. Climat EMPEROR/THORNS, pattern rythmique à rendre Hellhammer jaloux, arrangements grandiloquents et voix d'outre tombe, le tout compressé au delà de toute raison pour accentuer l'aspect glacial de l'ensemble. S'ensuit une cover fabuleuse du "Army of Me" de Björk, traitée selon les préceptes Black modernes en vigueur. Sans manquer de respect au reste de Traveller, c'est évidemment le centre de gravité de l'affaire, tant le lifting offert au morceau de l'énigmatique islandaise est total, au point qu'il devient très difficile de reconnaître la structure originale. Une fois de plus, autour du coeur même de la composition gravitent moult arrangements synthétiques qui loin d'offrir un ornement futile l'enrichissent.
Et après un court segment purement Cyber Black, "Visions of Nehaya", qui alterne les parties furieuses et les tensions lourdes, la conclusion nous est offerte par un remix de "The Malady" qu'on trouvait sur leur premier album. Nous gravitons pendant plus de sept minutes en plein terrain EBM/Indus, et là aussi, le cas n'est pas surfait. On aurait pu penser que clôturer un EP de moins d'une demi heure par un regard sur le passé l'aurait condamné à une redite redondante, mais l'ambiance FEAR FACTORY/RHYS FULBER/SKINNY PUPPY alterne le chaud et le froid, se développe dans des atmosphères sidérales, et achève de nous convaincre de la richesse et du mystère entourant le monde décidemment à part de KHONSU.
Du Black, à n'en point douter, des développements progressifs et envoûtants, une richesse instrumentale indéniable, le tout enveloppé dans un joli tissu électronique, il n'en fallait pas plus pour être séduit, et se remettre la galette plusieurs fois d'affilée. Histoire de se retrouver dans un vieux local norvégien, un après midi d'hiver, pour mixer à la perfection des influences qui finalement s'accordent à merveille. Un album presque parfait, un EP/intermède pertinent, espérons que les aventures de KHONSU continuent, et nous donnent encore envie d'aller faire un tour au pays de la nuit éternelle.
Ajouté : Vendredi 20 Mars 2015 Chroniqueur : Mortne2001 Score : Lien en relation: Khonsu Website Hits: 5392
|