# 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
}
CALIBAN (de) - Ghost Empire (2014)

Label : Century Media Records
Sortie du Scud : 27 janvier 2014
Pays : Allemagne
Genre : Metalcore
Type : Album
Playtime : 12 Titres - 48 Mins
L'enfant terrible du Metalcore teuton respire encore. Blotti contre les premiers rayons de soleil de 2014, il s'étire, précisément à l'endroit où on l'avait laissé il y a deux ans avec I Am Nemesis. On peut avoir un avis divisé sur ce dernier, et c'est même plutôt normal, puisque pour la première fois depuis le très bon The Opposite From Within de 2004, CALIBAN a eu la prodigieuse idée de nous concocter un Metalcore enrichi en protéines, largement plus nourrissant que toutes leurs sorties post-The Undying Darkness. Mais il faut bien comprendre qu'après dix-sept ans de bons et loyaux services, sortir aussi évidement de la torpeur d'un The Awakening est simplement une bénédiction. Pourtant, tout n'était pas gagné d'avance. "We Are The Many" aurait très bien pu être une parenthèse ensoleillée qui troue un ciel pluvieux, tout comme "The Bogeyman" ou "Dein R3.ich". Autant d'éclaircies qui confirment désormais le redoux. CALIBAN, avec ce neuvième album studio, est reparti pour un tour. Et fort logiquement, haters gonna hate.
Paradoxalement, les Allemands ne vont pas séduire de suite. Ce qui saute à la gorge, dès l'arrivée prématurée du premier tube de l'opus, "King", c'est cette production volumineuse, cette rondeur dans le riff (d'aucuns y verront une notion Djent, mais attendez d'entendre "I Am Ghost"), ce refrain putassier, ce break lunaire, comme l'avait été celui de "Memorial", probablement le meilleur titre d'I Am Nemesis, ainsi que la performance virile d'Andy Dörner qui nous avait habitué à des sorties plus pondérées. Ghost Empire semble cuit dans un moule qu'on connaît bien désormais, même si ça ne ressemble pas tout de suite à du CALIBAN pur jus. Ceux qui regrettent encore le charme très aléatoire de Say Hello To Tragedy seront surement déstabilisés par une "Chaos – Creation", tapinant presque sur les trottoirs souillés du Metalcore U.S. Mais derrière ça, derrière ce monticule d'artifices, les Allemands ne cesseront de rappeler qu'ils sont un groupe avec du cœur et qu'ils l'ont toujours été, peu importe la manière. Andy est très investi dans des vocaux qu'il maitrise avec de plus en plus de professionnalisme (il était temps, je vous l'accorde), et il est soutenu dans sa démarche par la paire Denis-Marc, inspirée pour certains riffs par tout ce chambardement Chaotic-Post-Math-Djent et compagnie. Il y a par exemple "Devil's Night" (tout ce qui gravite autour du refrain est classique), suivie de "yOUR Song", qui fouette davantage le PARKWAY DRIVE grassouillet. Depuis I Am Nemesis, CALIBAN est devenue une bête blessée au regard sombre, qui l'exprime toujours plus fort au détour de ces pauses atmosphériques et du chant clair de Denis, œuvrant sur des refrains fantomatiques ("Cries And Whispers"). C'est désormais une nouvelle marque de fabrique pour eux, effaçant la pertinence de leurs meilleurs morceaux d'antan. Je pense par exemple à "It's Our Burden To Bleed" ou à l'inoffensive "Life Is Too Short", relégués au rang de faire-valoir. Parfois plus mélodique et souriant ("Who We Are"), parfois carrément morose ("Good Man"), Ghost Empire alterne les humeurs massacrantes et les regards optimistes, concentrés dans un disque extrêmement lunatique mais à la hauteur de nos nouvelles espérances. Et si CALIBAN s'est avant tout aidé tout seul avant un coup de pouce de l'ordre du divin, certains apporteront un écot offensif non-négligeable à l'affaire. Comme d'habitude, Kotsche de CALLEJON est à la fête sur "Good Man" mais c'est la présence vocale de son compère, le reconnaissable entre mille BastiBasti (qu'on a déjà entendu cette année sur un titre d'ESKIMO CALLBOY), qui fera toute la richesse de "nebeL". Quant au plus bling-bling, il est réservé pour la fin. On s'inquiète un poil au début électrisé de "Falling Downwards", mais c'était sans compter sur le soutien d'un certain Matt Heafy, qui vient rendre ce morceau foutrement moins anecdotique. A noter que cette friandise est destinée aux heureux acquéreurs de la version digipack.
Mais honnêtement, on n'avait vraiment pas besoin de ce bonus (assez superficiel, il faut le dire) pour être convaincu par Ghost Empire. Dans le sillage du souverain I Am Nemesis, bien qu'inférieur à mon sens, ce neuvième full-lenght renoue avec un certain sens de la performance qu'on avait zappé depuis une bonne petite décennie. Le Metalcore n'a plus la même profondeur ni les mêmes horizons que celui qui explosait n'importe comment du temps de Vent. Et si CALIBAN a eu un coup de mou désagréable au vu de sa notoriété, ils se sont battus pour faire revivre ce côté visionnaire qui ravage aujourd'hui l'âme tourmentée de Ghost Empire.
Ajouté : Dimanche 24 Août 2014 Chroniqueur : Stef. Score :     Lien en relation: Caliban Website Hits: 10304
|