# 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
}
MYSTIC PROPHECY (de) - Fireangel (2009)

Label : Massacre Records / Season Of Mist
Sortie du Scud : 22 mai 2009
Pays : Allemagne
Genre : Power Metal
Type : Album
Playtime : 11 Titres - 46 Mins
Mine de rien, MYSTIC PROPHECY en est à son sixième album. Preuve d’une régularité exemplaire, Fireangel débarque 2 ans après Satanic Curses (2007), toujours dans la même veine Power Metal (l’affiliation avec ICED EARTH est parfois difficilement dissimulée). Un Power Metal encore plus agressif que lors des précédentes offrandes, parfaitement incarné sur cette pochette très sombre à la limite du tableau gothique funéraire (jusque là, les pochettes de MYSTIC PROPHECY donnaient dans le trip chevaliers noirs et sorciers domptant le feu). Au programme : des riffs acérés, tranchants comme une lame de rasoir, des breaks ravageurs parfaits pour headbanguer, des double lead guitars excellentes, un chanteur au sommet de son art et une section rythmique qui matraque tout. Un vrai bonheur.
Si diverses personnalités ont autrefois intégré les rangs de MYSTIC PROPHECY, comme le guitariste Gus G (ex-ARCH ENEMY, actuel FIREWIND) ou encore l’ancien batteur de PRIMAL FEAR Klaus Sperling, notons que le quintet présente sur Fireangel un line-up tout neuf. Constantine (guitare), Connie Andreszka (basse) et Stefan Dittrich (batterie) ont rejoint le membre fondateur Roberto Dimitri Liapakis (chant) et Markus Pohl (guitare). Et on tient peut-être avec cette nouvelle équipe la principale raison d’un durcissement de ton bénéfique et terriblement efficace.
Un mot quand même, et avant toute autre chose, sur la performance de Liapakis : synthèse vocale improbable de Phil Anselmo, Phil Rind (SACRED REICH), Blaze Bayley et Andy B. Franck (BRAINSTORM), le bonhomme sait où il mène son groupe, avec force, puissance et émotion. Ce gars là a tout d’un grand.
Liapakis fait le lien, avec grand talent, entre parties rythmiques dévastatrices et lignes mélodiques retenues. Pourquoi « retenues » ? Simplement parce qu’à aucun moment MYSTIC PROPHECY ne tombe dans le Power Metal facile, trop simple ou trop prévisible. D’un point de vue strictement instrumental, on prend avec « Gods Of War » un gros Death Metal technique en pleine gueule. Le chant de Liapakis nous ramène en territoire Power, mais la baffe, on se l’est prise et on ne l’a pas vue venir. La lead guitare omniprésente de « Accross The Gates Of Hell » (titre d’ouverture) évoque le DEATH des grands jours, tandis que le refrain et les solos apportent la petite touche nuancée à un Metal sans pitié. De même, les rythmiques thrashy et groovy de « Father Save Me » contrastent habilement avec des parties plus accessibles.
Rien que le premier riff, énorme, de « Forever Betrayed » annonce un putain de morceau. Quand les arpèges et cordes étouffées font taper du pied sur les couplets, le tempo ralentit pour faire place à un refrain qu’on retient tout de suite. La classe. Car la classe, MYSTIC PROPHECY l’a aussi lorsque le combo adoucit (attention le terme « adoucir » doit être relativisé, on parle de Power Metal quand même !!) son discours, à l’image d’un « Fight Back The Light », plus mélodique tout en restant fidèle aux fondements du Metal lourd, avec Power Chords et envolées vocales de rigueur. Un peu comme « To The Devil I Pray », qui retient également l’attention.
Et puis il y a ces mid-tempos que votre serviteur affectionne … au point de pouvoir les écouter 30 fois de suite. « Revolution Evil », fausse ballade où la double grosse caisse soutient immédiatement un martèlement Heavy comme jamais, est de cet acabit. « Demons Crown », bâti de la même façon, se veut moins convaincant.
Mais quand même.
Il serait peut-être temps, avec Fireangel, que l’on s’intéresse de plus près à MYSTIC PROPHECY.
Voilà un groupe méritant, qui sort des opus de qualité sans jamais lever le pied.
Vous savez ce qui vous reste à faire …
Ajouté : Samedi 27 Juin 2009 Chroniqueur : NicoTheSpur Score :     Lien en relation: Mystic Prophecy Website Hits: 9503
|