# 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
}
ALESTORM (uk) - Black Sails At Midnight (2009)

Label : Napalm Records / Season Of Mist
Sortie du Scud : 29 mai 2009
Pays : Ecosse
Genre : Pirate Metal
Type : Album
Playtime : 10 Titres - 46 Mins
Ohé, ohé, capitaine abandonné … ohé, ohé, mets des ailes à ton voilier …
Bon OK j’arrête le délire. C’est simplement qu’en allant voir sur la page MySpace d’ALESTORM, j’y ai vu cette photo de Christopher Bowes et son « clavier-guitare », et immanquablement je me suis dit « oh putain GOLD est de retour !!!!! ». Et puis ça aurait pu être le fameux Frédéric François de chez Cauet ... Mais non, en fait. C’est bien d’ALESTORM dont je vais vous parler aujourd’hui, pour la suite de la revanche du capitaine Morgan (et celui-là, il est pas abandonné …).
Alors s’il ne fait aucun doute que Jack Sparrow et Barbe-rouge se sont trouvé des fans au sein même de la confrérie Metal ces dernières années (certes il y avait déjà RUNNING WILD, mais avec ALESTORM et bientôt SWASHBUCKLE cet été, la liste de borgnes boiteux s’allonge à vue d’œil), en revanche chacun pratique le « Pirate Metal » à sa façon. Et à propos d’ALESTORM, la même question revient toujours : s’agit-il d’une vaste blague, l’œuvre d’un groupe voué à la déconnade, ou alors (et là ce serait plus inquiétant) ces gars-là se prennent-ils vraiment au sérieux ?
La seconde hypothèse me paraît bien peu crédible, à l’écoute d’un « Keelhauled », hymne de Punk Metal idéal pour pogoter et défoncer tout ce qui bouge en pleine fête foraine … Le pire dans cette histoire, c’est qu’ALESTORM parvient presque à nous faire danser sur son Pirate Metal ! Il ne se prive pas d’accentuer encore son côté festif sur Black Sails At Midnight, on se croirait limite en fin de soirée arrosée dans un Pub irlandais sur des morceaux carrément entraînants (« Wolves Of The Sea »). Le gros problème quand on se bourre la gueule et qu’on fait la fête, on finit par faire des conneries et sombrer en pleine « beaufitude ». Entre le clavier qui baise un accordéon sur « Leviathan » et qui ferait passer Patrick Sébastien et Soldat Louis pour des compositeurs romantiques sur « Pirate Song », voilà qui provoquera bien des fous rires. Mais on l’a dit, ALESTORM ne philosophe pas … Enfin on espère …
Et puis la voix de Bowes, ouarf … Comment vous dire ? Bon, vous voyez le méchant pirate à tête de pieuvre sur la pochette, qui fronce les sourcils et doit puer de la gueule ? Ben voilà, Bowes, il imite la voix de ce vilain pas beau. C'est-à-dire la voix du méchant à voix de sadique genre Skeletor … Mais au moins, oui au moins, rendons à Bowes le mérite qui lui revient : il se charge des voice-overs avec cette même voix, ce qui n’est pas déplaisant. C’est au moins ça de gagné !!
Et puis ce dont j’ai peur avec ALESTORM, c’est que Black Sails At Midnight sonne daté assez vite. Par exemple, prenons un « That Famous Ol’Spiced ». Bien que ce Metal, qu’on qualifiera de conquérant à cause d’arrangements assez proches de la B.O. de « Pirates des Caraïbes », contienne là aussi des chœurs festifs et virils, je pense que de bons riffs à la gratte auraient déglingué ce clavier trop « kitch ». Voilà qui constitue la différence essentielle entre un ALESTORM et un subtil BLIND GUARDIAN. M’enfin, les guitares de Dani Evans ne sont pas au mieux de leur forme non plus au sein d’ALESTORM. On tient sûrement le riff le moins recherché de l’histoire du Metal sur (« Chronicles Of Vengeance »). Et ce clavier de merde ! Aussi travaillé que sur les génériques de dessins animés de Jean Chalopin …
Oui, vous avez remarqué qu’entre GOLD, Skeletor et Jean Chalopin, je vous bassine avec les années 80. Et alors ? ça vous bouscule dans le calbute ? Je ne vois pas pourquoi ALESTORM aurait le droit de se marrer et pas moi. Bref, continuons …
Histoire de terminer cette chronique sur une note plus positive, je dois quand même vous dire que quand ALESTORM donne dans le Speed Metal efficace, ça arrache sévère. Entre hymnes à la RHAPSODY/GAMMA RAY (« The Quest ») et un « Black Sails At Midnight » qui hisse le pavillon noir du navire CHILDREN OF BODOM, voilà qui contraste avec les rigolades ci-dessus. Cependant les fans de Captain Morgan’s Revenge resteront en terre connue …
Enfin, un mot sur « To The End Of Our Days ».
Joué sur un tempo ralenti (par rapport au reste de l’album), suscitant un sentiment imposant de puissance, il exploite enfin les capacités de son chanteur/clavier à 100 %. S’il joue le rôle d’un orchestre discret sur les premières mesures, il se mue par la suite en cornemuse, en orgue Hammond ou encore en cordes de velour, tandis qu’un excellent refrain à plusieurs voix sublime le tout.
Et si, pour survivre, le pirate ALESTORM devait s’engager définitivement sur ces mers moins tumultueuses ?
Ajouté : Mardi 02 Juin 2009 Chroniqueur : NicoTheSpur Score :    Lien en relation: Alestorm Website Hits: 16797
|