# 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
}
AMORPHIS (fi) - The Beginning Of Times (2011)
Label : Nuclear Blast
Sortie du Scud : 27 mai 2011
Pays : Finlande
Genre : Metal mélancolique
Type : Album
Playtime : 12 Titres - 54 Mins
AMORPHIS est un groupe unique. Voilà le seul combo de l’univers métallique en particulier, et puis même musical en général, qui peut se vanter de condenser Metal gothique, Death Metal, Rock progressif, influences celtiques ou arabisantes, en quelques notes à la beauté indéfinissable. Le tout mené par la voix tantôt planante, tantôt agressive de Tomi Joutsen, la guitare inspirée d’Esa Holopainen ou le piano de Santeri Kallio, et sans la moindre faute de goût. Après les déjà très beaux Eclipse (2006) et Silent Waters (2007), le somptueux Skyforger (2009) et la parenthèse Magic & Mayhem (2010), AMORPHIS poursuit sur sa lancée.
A peine The Beginning Of Times débute-t-il que la messe est dite : en un titre, le morceau d’ouverture « Battle For Light », AMORPHIS frappe très fort. Au risque de se répéter, car il faut bien insister sur ce point, le Metal d’AMORPHIS (et même le mot « Metal » devient réducteur) se veut encore et toujours d’une richesse impressionnante. Un peu à l’image des thèmes abordés dans ses chansons, ce qui le différencie davantage du groupe lambda. Cette fois encore, AMORPHIS puise dans le Kalevala (le recueil qui regroupe les légendes et mythes finlandais), chantant la création du monde (qui serait né à partir d’un œuf de canard, d’où la pochette …) et les aventures de son personnage principal, le barde Väinämöinen. Avec l’aide du fidèle parolier Pekka Kainulainen, AMORPHIS apporte à son Metal ce soupçon de poésie rarement présente dans le genre. Alors, comme dans les plus belles épopées, chaque composition a sa propre histoire, sa propre ambiance.
Si le terme de « barde » laisse supposer des contes aux idéaux pacifiques, celui qui s’intéresse de près au Kalevala comprend vite qu’il est aussi question de vengeance ou de meurtres fréquents. Forcément, AMORPHIS y retrouve une violence presque oubliée : « Crack In A Stone » renvoie carrément aux origines Death Metal, bondissant certes, mais techniquement Death, sans aucun doute, comme les passages les plus saccadés de « Southsayer ». Sans compter que Tomi Joutsen s’en donne à cœur joie et sans complexe : même les mélodies au piano de « My Enemy » ou « Song Of The Sage » ne peuvent l’empêcher de chanter de cette voix d’outre-tombe du plus bel effet. Joutsen, chanteur emblématique, incarne à lui seul la diversité d’AMORPHIS, et même si on l’a déjà dit maintes et maintes fois, on tient peut-être là l’un des frontman les plus intéressants du Metal depuis bien des années. Et alors, cette voix aérienne, quel régal !!! Il ne serait rien, bien évidemment, sans les compositions concoctées par ses comparses.
Et elles sont encore une fois nombreuses ces lignes accrocheuses, ces quelques notes au piano, à la flûte ou à la six-cordes qui font mouche : du thème de « Three Words » (et son revirement final diabolique) aux notes et chœurs imparables de « Reformation », en passant par la gothique mélancolie de « Southsayer », l’interlude Folk de « Song Of The Sage » (et quel solo de Holopainen !) ou le tourbillon de « Mermaid ». Forcément, un album d’AMORPHIS ne serait rien sans ses singles en puissance, mais là on peut vraiment parler de festival : le titre éponyme « Beginning Of Times », « You I Need », tout y passe ! Et puis, un peu à l’image d’un PARADISE LOST à une certaine époque, AMORPHIS a trouvé une astuce imparable : agrémenter ses chansons d’une voix féminine douce et sensuelle, en l’occurrence celle de Netta Dahlberg.
Il peut arriver, par instants, de ressentir une impression de « déjà-entendu », puisque le rythme soutenu de « Mermaid » rappelle « Sky Is Mine », par exemple.
Mais qu’il est difficile de trouver un vilain défaut à ce Beginning Of Times. Pour les adeptes de Skyforger, son successeur se révèlera un poil plus brutal.
Ce n’est qu’une apparence.
Car il touche du bout des doigts la perfection de la diversité métallique … et au-delà.
Ajouté : Mercredi 06 Juillet 2011 Chroniqueur : NicoTheSpur Score : Lien en relation: Amorphis Website Hits: 10684
|