# 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
}
POISONBLACK (fi) - Drive (2011)
Label : Hype Records
Sortie du Scud : 27 avril 2011
Pays : Finlande
Genre : Hard Rock
Type : Album
Playtime : 10 Titres - 44 Mins
Drôle de parcours quand même, que celui de POISONBLACK. Alors que le combo devrait profiter à plein tube de la notoriété de son ex-SENTENCED de leader (Ville Laihiala, ex-SENTENCED), il semble qu’au contraire, POISONBLACK tende à retomber dans un certain anonymat. Après avoir passé 10 ans chez Century Media, POISONBLACK se trouve signé sur un label bien plus modeste, Hype Productions (basé en Finlande). Conséquence directe : le nouvel album Drive est passé quasiment inaperçu et n’a même pas été distribué dans la plupart des pays européens.
Par ailleurs, POISONBLACK a du faire face au départ de son second guitariste, Janne Markus. Continuant sous la forme d’un quatuor, le style de POISONBLACK n’est pas vraiment bouleversé et on peut même dire que Ville et consorts persistent et signent dans la voie qu’ils ont tracée depuis Of Rust And Bones. Pour faire court, il ne reste que peu de traces de l’héritage laissé par SENTENCED et par les premiers albums de POISONBLACK. Jusqu’à, disons, A Dead Heavy Day.
Le cru POISONBLACK 2011 sonne encore plus crasseux, avec un Ville Laihiala dont la voix s’éraille album après album. Résultat du cocktail clopes / whisky ? A n’en pas douter. Tant pis pour la santé du gusse, et tant mieux pour nous. Disons que la musique de POISONBLACK jouit aisément de cette particularité vocale, pour appuyer son Hard Rock groovy, cradingue, à la fois old-school et brut de fonderie. Parfois, POISONBLACK évolue à la limite du stoner, quand le riff bien lourd et le solo bluesy de « A Good Day For The Crows » résonnent dans nos petits tympans. Voilà qui contraste avec ce que proposait POISONBLACK il y a quelques années encore …
Le suave « From Now-Here To Nowhere », avec quelques brefs relents d’autrefois, frôle à peine le Gothic Rock mélancolique que les fans de la première heure cherchent désespérément. La nostalgie refait surface sur le mid-tempo « Scars », sorte de ballade Rock munie d’un duel guitare / clavier très mélodique. A ce titre, Marco Sneck a volontairement – ou pas – mis de côté l’orgue Hammond dont il abusait sur Of Rust And Bones. Et se fait bien plus discret. Seule la chanson « Futile Man », avec son refrain proche de des titres de A Dead Heavy Day, et ses dernières mesures très aériennes, semble laisser un peu de place à Marco Sneck mais aussi à la basse d’Antti Remes.
Ville Laihiala, en revanche, déchaîné comme une diable avec sa six-cordes, s’en donne à cœur joie. Certains titres ne semblent avoir été écrits que comme prétexte à un excellent solo, comme la directe mais passe-partout « Driftwood » ou la ballade peu marquante « The Dead-End Stream ». Et puis Ville, la pédale wah-wah, c’est formidable, mais il faudra peut-être éviter, à l’avenir, de nous en faire bouffer à toutes les sauces. Ça fonctionne à coup sûr sur « Sycophant » et sa rythmique Heavy Metal, mais ce n’est pas sûr que ça marche encore pendant 20 ans … Maintenant rendons à César ce qui lui appartient, le garçon place la barre assez haut et fait parler sa guitare comme jamais il ne l’avait fait jusque-là.
Pour le reste, POISONBLACK est toujours capable de proposer du matériel très direct (« Piston Head »), avec de bons gros riffs, des arpèges électrisées savoureuses, et des refrains aptes à botter le cul de n’importe quel single de NICKELBACK (« Mercury Falling », « Maggot Song »). Et dans ces cas là, c’est le pied intégral … La seule réelle déception sur Drive, c’est de ne pouvoir écouter aucun titre proche de « The Last Song », le genre de compo qui démarre en douceur et qui finit en trombes. On l’espérait avec « Futile Man », mais il n’en est rien. Dommage.
Dans la droite lignée de son prédécesseur Of Rust And Bones, Drive constitue un bon album qui mérite un peu plus que l’ignorance totale dont il est victime.
Ajouté : Mardi 31 Janvier 2012 Chroniqueur : NicoTheSpur Score : Lien en relation: Poisonblack Website Hits: 12918
|