# 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
}
BEAST IN BLACK (fi) - Berserker (2017)

Label : Nuclear Blast
Sortie du Scud : 3 novembre 2017
Pays : Finlande
Genre : Heavy Metal
Type : Album
Playtime : 12 Titres - 51 Mins
La nouvelle a été annoncée peu après la sortie de l'album Unholy Savior (en Janvier 2015) : "A la suite d'une mûre et intense réflexion, BATTLE BEAST a décidé de se séparer de son guitariste Anton Kabanen. Ceci est dû à des divergences musicales et d'autres problèmes insolubles inhérents au groupe. Kabanen a annoncé qu'il continuera à faire de la musique au travers d'autres projets". En vérité, le guitariste-fondateur-compositeur-producteur Anton Kabanen s'est retrouvé viré sans ménagement du groupe qu'il avait lui-même fondé. Qu'à cela ne tienne...
Loin de rendre les armes, Kabanen a monté dans la foulée son propre groupe, proche de sa formation précédente, que ce soit d'un point de vue visuel (le logo, le nom) ou musical (les fans de BATTLE BEAST ne seront pas dépaysés). Aidé en cela par son collègue bassiste de WISDOM Máté Molnár, ils se sont entourés du batteur Sami Hänninen et de l'ex-U.D.O Kasperi Heikkinen (guitariste à la dextérité aussi appréciable que Kabanen). Restait à trouver le frontman qui éviterait à BEAST IN BLACK le statut de énième groupe de Heavy Metal. Et là, Kabanen a déniché la perle rare en la personne de Yannis Papadopoulos. Le frontman grec nous avait déjà épatés en reprenant "The Sentinel" de JUDAS PRIEST avec WARDRUM, mais ce n'était qu'un apéritif...
Au milieu de ces musiciens hors pair, le garçon affiche un impressionnant panel de possibilités. Prenons ce titre phare, "Blind And Frozen". Bon, le clip et l'intitulé de la chanson évoquent "La Reine des Neiges", mais là n'est pas le sujet... Sur un titre construit tel les "Bye Bye Beautiful" ou "Wish I Had An Angel" de NIGHTWISH, Yannis Papadopoulos trompe son monde sur des couplets tout en velour. Sans déconner, au premier abord, on croirait entendre susurrer une énième chanteuse de Metal mélodique. Et il n'en est rien... Quand survient le refrain – très accrocheur à l'image de tout l'album Berserker – ça explose dans tous les sens.
BEAST IN BLACK, c'est ça. Une recette simple, percutante. Un Heavy Metal énergique, séduisant, parfois à fond les claviers ("Eternal Fire", "Born Again", "Blood Of A Lion"), flirtant dangereusement avec les clichés des 80's sans sombrer dans la parodie (mais c'est juste, juste hein), s'essayant occasionnellement au Power Metal plus agressif ("Zodd The Immortal") ou à un Electro Metal prêtant à sourire ("Crazy, Mad, Insane"). Avec Berserker, on pense à BATTLE BEAST bien sûr, à LORDI aussi (pour cette faculté à pondre des lignes vocales très mémorisables et l'omniprésence des claviers), et au Metal mélodique "made in Finlande" en général. Il y a un paramètre à ne pas négliger avec Kabanen, et déjà au sein de BATTLE BEAST, on décelait chez lui cette faculté à manier facilement le "songwriting". En gros, Anton sait comment pondre des hymnes à l'efficacité redoutable : "Born Again" démarre comme un "hit" et pourra être repris en choeur par la foule, "Eternal Fire" lorgne vers un "The Final Countdown" (EUROPE) ou "Vain Glory Opera" (EDGUY), "End Of The World" évoque plutôt un SABATON version saumon/aneth/moutarde/vin blanc, et objectivement la plupart des chansons rentre dans le crâne comme le feraient les crocs d'un lion légendaire (vue, la pochette ?).
Rajoutez à cela des solos à la six-cordes dignes des meilleures du Heavy Metal : ça va vite, ça envoie de la gamme dans tous les sens, ça s'affronte dans des duels hystériques. Entre un "Go To Hell", un "The Fifth Angel", un "Hell For All Eternity", un "Blood Of A Lion", Anton Kabanen et Kasperi Heikkinen s'en donnent à coeur joie. Difficile pourtant d'éclipser, malgré toutes ces prouesses, le talentueux Yannis Papadopoulos. On l'a déjà encensé plus haut, mais quand même... Il sait s'adapter au contexte (puisque plus haineux sur "Zodd The Immortal"), il sait atteindre des notes inimaginables ("The Fifth Angel"), il sait chanter avec nuance ou hurler à pleins poumons, bon en fait il sait tout faire.
Avec autant d'arguments à faire valoir, il faudra surveiller attentivement BEAST IN BLACK dans les années qui viennent. Ce premier album véhicule une force positive et communicative, à n'en pas douter. Reste à savoir si Kabanen suara l'emmener plus loin que BATTLE BEAST, ou si il sera condamné à produire le même genre de disques à vie...
Ajouté : Jeudi 22 Mars 2018 Chroniqueur : NicoTheSpur Score :     Lien en relation: Beast In Black Website Hits: 6767
|