# 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
}
ENSIFERUM (fi) - From Afar (2009)

Label : Spinefarm Records / Season Of Mist
Sortie du Scud : 9 septembre 2009
Pays : Finlande
Genre : Heroic / Folk Metal
Type : Album
Playtime : 9 Titres - 57 Mins
Au pays des mecs en jupette ou peaux de bêtes qui glorifient en musique les sagas épiques de la mythologie nordique, ENSIFERUM fait sans doute partie des plus anciens et des plus reconnus. Par pudeur, on évitera de préciser que ce combo en activité depuis 1995, largement estimé s’il en est, nous vient de Finlande et qu’avec From Afar, ils nous pondent seulement leur quatrième full-lenght studio. Autant dire que l’offrande est rare et que leur rythme de croisière est légèrement différé par rapport aux sorties annuelles de KORPIKLAANI. Ainsi il faudra veiller à se délecter de la moindre seconde car on risque de patienter un petit bout avant de réentendre nos joyeux lurons sur galette. Alors festoyons mes frères ! Jouissons tous ensemble de cette sortie, placée comme de coutume sous l’égide des grands dieux nordiques, des cavalcades légendaires, des croisades enneigées, du folklore local et de l’Heroic Metal !
Après avoir contemplé une cover des plus traditionnelles, aux tons bleutés et ambiance polaire, on pourra sans peine se lancer dans l’écoute du successeur de l’excellent Victory Songs. Je serais tenté de dire que de prime abord, ENSIFERUM nous fait du… ENSIFERUM. Une longue introduction instrumentale acoustique et typiquement Folk vient détendre les esprits avant la grosse claque qui se devait d’être éponyme. « From Afar » verse dans le grandiloquent avec des claviers précis, des guitares enchantées, une batterie à blinde et des chœurs vikings. Une recette déjà largement employée dans le passé mais toujours propice à la création et à l’inspiration. Si les scandinaves ne se sont pas creusés les méninges à développer de nouvelles idées, on ne peut guère le leur reprocher au vu du résultat excellent. Aux pistes relativement courtes et intenses succèdent de larges pamphlets dignes de figurer sur la bande-son de n’importe quel épic movie, pourvu qu’il soit hollywoodien. Car vraiment, la musique d’ENSIFERUM est au Folk Metal ce qu’Hitchcock est au suspens : un maître du genre. From Afar nous enivre de son parfum d’épicéa, nous plie dans une pesante tenue de combattant, loyal et fidèle. Le poids de l’épée n’est rien comparé à la volonté débordante du quintet. Les onze minutes d’« Heathen Throne » et les douze de « The Longest Journey » imposent ces deux compositions comme la tête et les bras du disque autour desquels s’articulent des armes et des munitions telles « Twilight Tavern » ou « Elusive Reaches ». Parmi les nombreux instruments traditionnels qui offrent cette ambiance festive, on retrouve le kantele (type de cithare), le nyckelharpa mais aussi, dans un style plus contemporain : l’orgue hammond, le banjo, la mandoline, la flûte irlandaise… Une maîtrise technique hors-normes exploitée au maximum grâce aux nombreux instrumentistes invités. Pourtant, je ne pourrais m’empêcher de noter quelques redondances imposées par le genre pratiqué. Pour notre plus grand bonheur, ENSIFERUM a pris soin de les minimiser, rendant son album très accessible et très agréable.
Si From Afar s’adresse avant toute chose à un public connaisseur, sa renommée au sein de la scène Metal mondiale ne pourra empêcher les novices d’apprécier et d’y reconnaître sans mal les nouveaux patrons de la scène Folk, (ELUVEITIE et consorts). Tout en restant diablement classiques, les finlandais sont néanmoins parvenus à faire chanter de manière profonde et sincère les canons du Folk Metal qu’ils ont eux même érigés de par le passé. Quelque chose me dit qu’avec ENSIFERUM, on n’est pas sorti d’Afar…
Ajouté : Jeudi 11 Février 2010 Chroniqueur : Stef. Score :     Lien en relation: Ensiferum Website Hits: 15013
|