# 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
}
AMON AMARTH (se) - Jomsviking (2016)
Label : Metal Blade Records
Sortie du Scud : 18 mars 2016
Pays : Suède
Genre : Death Viking mélodique
Type : Album
Playtime : 10 Titres - 52 Mins
Pour la première fois de son histoire, AMON AMARTH s'est lancé dans la réalisation d'un concept album. Bien entendu, ce dixième (déjà ?!!) album studio n'aborde pas le sujet épineux de l'évasion fiscale ou du port du burkini sur la plage... AMON AMARTH reste AMON AMARTH et forcément, Jomsviking est un disque consacré à ces mercenaires vikings et païens qui quittaient leur forteresse de Jomsborg pour aller piller et massacrer les ennemis de quelques seigneurs – aussi chrétiens pouvaient-ils être – en échange d'émoluments non négligeables. De vrais mercenaires quoi, qui, s'ils avaient beau vénérer les habituels Dieux d'Asgard, n'en crachaient pas pour autant sur l'argent. Aujourd'hui ces gars-là feraient fureur mais là n'est pas le sujet...
Plus que la teneur des textes écrits par le géant et toujours charismatique chanteur Johan Hegg, c'est l'hommage appuyé aux réelles influences du quintet suédois que l'on retiendra dans ce Jomsviking. AMON AMARTH reste AMON AMARTH – on l'a déjà dit – et appartient à cette horde de combos que l'on ne critiquera jamais pour utiliser maintes et maintes fois la même recette. D'entrée ce "First Kill", que l'on qualifiera juste de guerrier, convenu et efficace, met les pendules à l'heure (à l'inverse, "One Against All" semblera tellement prévisible qu'il perd en saveur). Il introduit aussi de la meilleure des manières Tobias Gustafsson (ex-VOMITORY), batteur remplaçant du démissionnaire Fredrik Andersson. Et le garçon assure fort, très fort.
A peine le temps de s'en remettre que résonnent les doubles guitares mélodiques de "Wanderer". Ce qui apparaît alors évident, c'est que si AMON AMARTH a, à ses débuts, pratiqué un Death Metal certes mélodique mais quand même rugueux, il emprunte davantage au Heavy Metal et au Thrash Metal qui nous ont tous bercés. L'intro de "On A Sea Of Blood", c'est du SLAYER pur jus, la rythmique qui s'en suit s'inspire des heures de gloire d'IRON MAIDEN, MEGADETH, et METALLICA réunis (Johan Hegg a d'ailleurs toujours prétendu que James Hetfield était son modèle). Un sévère clin d'œil est adressé aux mêmes héros sur "At Dawn First Light" : entre la ligne mélodique digne du duo Adrian Smith / Dave Murray (comme pour le solo), et des riffs que n'aurait pas renié le regretté Jeff Hanneman, AMON AMARTH ne se cache plus.
Et puis, comment passer sous silence la présence de la belle Doro Pesch ? Amenée à répondre à Johan Hegg sur le Heavy (ben oui...) "A Dream That Cannot Be", la Metal Queen évolue pour le coup à contre-emploi. Mais contre toute attente, alors que ce titre semble au départ assez quelconque, la voix de la Walkyrie se marie assez bien aux riffs pondus par la paire Olavi Mikkonen / Johan Söderberg. Qui l'eut cru ? Après avoir convié l'unique Messiah Marcolin sur Deceiver Of The Gods, AMON AMARTH se fait encore plaisir : de la prestation de Doro, ils admettent qu' "elle a été très pro". Mouais. On se dit surtout que ces Vikings à l'enthousiasme bien enfoui se sont permis, en deux albums, d'inviter deux figures incontournables du Heavy Metal.
Malgré ce dévouement pas dissimulé pour un sou au Heavy d'un autre temps, AMON AMARTH n'accouche pas d'un Powerslave ou Ride The Lightning à la sauce Death Viking. AMON AMARTH reste AMON AMARTH – ben oui on le redit encore – avec son style bien à lui et ces sonorités aisément reconnaissables. Seuls ces géants nordiques peuvent accoucher d'un riff syncopé comme celui de "Wanderer", de cette ambiance tribale qui annonce la chevauchée épique sur "The Way Of Vikings", de ce putain de mid-tempo nommé "Raise Your Horns" spécialement taillé pour la scène avec son refrain très Folk Metal !
Et si le final et mélancolique "Back On Northern Shores" ne procure pas l'impact émotionnel des classiques "The Hero" ou "Embrace The Endless Ocean" (sur Twilight Of The Thunder God), difficile de ne pas s'extasier à l'écoute de "One Thousand Burning Arrows". C'est un titre qui justifie tout ce que l'on vient d'exposer précédemment et qui vante les qualités d'AMON AMARTH : un morceau puissant et Heavy à souhait, souvent mené par un thème joué sur un son très clair voire épuré, avec des guitares toujours mélodiques. Jamais AMON AMARTH n'avait atteint cette perfection. "One Thousand Burning Arrows" symbolise à elle seule le message délivré par Josmviking, un album aux guitares fabuleuses et sur lequel AMON AMARTH avoue son adoration sans faille à ses idoles de toujours.
Ajouté : Jeudi 22 Septembre 2016 Chroniqueur : NicoTheSpur Score : Lien en relation: Amon Amarth Website Hits: 5300
|