# 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) - Magic & Mayhem - Tales From The Early Years (2010)

Label : Nuclear Blast / Pias
Sortie du Scud : 20 septembre 2010
Pays : Finlande
Genre : Death / Doom des premières heures
Type : Best-Of
Playtime : 13 Titres - 61 Mins
On a souvent tendance à penser que l’AMORPHIS des débuts était résolument plus sombre et violent que l’AMORPHIS contemporain. Je dirais que Magic & Mayhem – Tales From The Early Years arrive finalement à point nommé… pour confirmer que oui, les finlandais avaient une vision du Metal toute différente de celle qu’ils ont transcrite sur Silent Waters ou Skyforger. Mais par quel pouvoir divin cette sortie aurait-elle le don de nous propulser une quinzaine d’années en arrière ? Vous vous en doutez peut-être, comme son nom l’indique en référence à Tales From The Thousand Lakes, ce nouveau brûlot (pas vraiment nouveau, il est vrai de par son contenu) est une sorte de « best-of » des meilleurs titres figurant sur les trois premiers opus du groupe, le tout réenregistré et réarrangé avec, pour la première fois, des versions chantées par un Timo Joutsen qui n’était pas encore dans le line-up à l’époque.
On peut d’ailleurs dire que le bonhomme s’est fort bien accommodé de sa nouvelle tâche qui est de faire « oublier » (en tout cas sur cet effort…) le Pasi Koskinen emblématique de la première ère AMORPHIS. Ses vocaux caverneux au possible font presque omettre que cette bande là joue aujourd’hui dans une cour totalement différente, celle du Rock un peu typé Gothic, un peu mélancolique, un peu tristounet, un peu givré. Pour l’occasion, un « Into The Hinding » ou un « Exile Of The Sons » sonnent sacrément Death, comme à la bonne vieille époque de leur Death/Doom ravageur, et même un peu Black comme sur « Vulgar Necrolatry », une reprise d’ABHORRENCE déjà en lice sur The Karelian Isthmus (1992) en guise de piste bonus. Musicalement, pas de surprises. C’est une version restaurée de leurs meilleurs tubes de l’époque. Un peu comme le nouveau DVD de Cendrillon, l’image est plus lumineuse, propre et colorée. Il ne neige plus sur Anastasia et Javotte. Il n’y a plus ce voile fade qui rend les terribles actions du chat Lucifer contre la petite souris Gus Gus troubles. Tout est peaufiné jusque dans les moindres détails. Et inutile de dire que le rendu des claviers (« The Castaway ») n’en est que meilleur. Pourtant, après le plus que complet double CD / DVD Forging The Land Of Thousand Lakes, je cherche encore l’intérêt réel que présente cette sortie pour chacun d’entre nous. Les fans, s’ils ne considèrent pas ce disque comme une énième pièce de collection, seront sans doute déçus par cette tournure étrangement portée d’un coup sur le merchandising de toute sorte. D’autant que niveau émotion ou nouveauté, y a pas de quoi casser des briques. Les néophytes, pour leur part, ne savoureront pas l’œuvre avec le palet qu’elle nécessite. Ils y verront une bonne occasion de se mettre à AMORPHIS, sans réellement savoir que Tales From The Early Years jouera les troubles fêtes dans leurs esprits qu’ils pensent encore limpides. Car AMORPHIS ne ressemble pas à ça aujourd’hui. Et ne ressemblait pas à ça dans le passé. Casse-tête chinois. Mais finalement, une notion reste primordiale. Personne ne boudera son plaisir en écoutant « My Kantele » mise au goût du jour ou un « Magic & Mayhem » superbement bien orchestré.
Un drôle de mystère, finalement, que ce Magic & Mayhem. On n’en comprend pas forcément l’utilité, mais on ne peut résister à l’envie de se laisser bercer par un AMORPHIS plus que jamais au top de sa forme. L’envie de fréquenter les studios devait être trop forte pour nos artistes boulimiques. Ne seraient-ils pas, en fin de compte, comme une femme enceinte qui se lève à 3 heures du matin pour manger un bol de fraises ? Une hypothèse intéressante dans l’optique où tout le monde tremble d’envie à l’idée d’entendre brailler le petit frère de Skyforger.
Ajouté : Vendredi 17 Septembre 2010 Chroniqueur : Stef. Score :     Lien en relation: Amorphis Website Hits: 11566
|