# 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
}
CYNIC (usa) - Traced In Air (2008)
Label : Season Of Mist
Sortie du Scud : 27 octobre 2008
Pays : Etats-Unis
Genre : Death Metal Progressif
Type : Album
Playtime : 8 Titres - 34 Mins
Je me dis parfois que le hasard est amusant…On assiste en ce morne automne à la sortie successive de deux albums de deux groupes cultes, chacun à leur façon…Deux comeback après presque 15 ans d’absence, pour deux Cds qui n’emprunteront sans doute pas le même chemin, puisque leurs géniteurs respectifs n’ont pas le même passé. Et pourtant, ils sont aussi importants l’un que l’autre pour moi, pour vous, pour des millions de fans pour le premier, et quelques milliers pour le second.
Après un Chinese Democracy de GUNS N’ROSES que beaucoup ont pris avec des pincettes, je m’attaque à un Traced In Air de CYNIC qu’on attendait certainement plus.
Il y a certainement beaucoup plus de fans qui connaissent ce nom aujourd’hui que nous l’étions nous-mêmes à l’époque. Dans un climat musical ravagé par les maisons de disques qui ne juraient plus que par Seattle et ses chemises de bûcherons, nous étions une poignée de fidèles à attendre impatiemment la sortie du premier album de CYNIC, ce qui fut enfin chose faite en 1993 avec Focus. Après avoir suivi les pérégrinations de ses membres sur l’album majeur du Chuck Shuldiner’s DEATH, Human, et sur pas mal d’autres albums ou les pistoleros étaient bien souvent demandés en renfort, nous avions hâte d’écouter LEUR propre musique…
Et dire que nous avions été surpris est un euphémisme…
L’histoire se répète, et les deux Sean et Paul reviennent fidèles à leurs convictions musicales, en compagnie d’un petit nouveau, Tymon, pour poursuivre leur œuvre. Que dire donc de Traced In Air ? Qu’il ressemble en tous points à Focus, la puissance du son en plus, et que les musiciens n’ont pas perdu leur talent en route.
Une fois l’intro « Nunc Fluens » passée, on se retrouve plongé dans le monde de CYNIC, ou la douceur et la volupté se dispute le leadership avec l’agression. Dès « The Space For This », et la voix passée au vocoder de Paul, on se croit volontiers reparti 15 ans en arrière…la dextérité est toujours là, le style est toujours unique, et ce titre se place d’emblée à hauteur en terme de qualité de « Veil Of Maya »…Comment définir cette musique qui semble venue d’un autre monde ? Mission quasi impossible, mélange de New-Age, de Jazz, de Metal, c’est presque un mantra, à l’image de son créateur, qui a investi toute sa foi dans la musique, au point d’en faire une thérapie.
Les lignes de guitare sont d’une telle pureté que seules des images irréelles pourraient les illustrer. On voit la nature, sous toutes ses formes, orchestrer un ballet céleste digne d’un univers parallèle où elle a repris ses droits.
L’aventure continue sur « Evolutionary Sleeper », ou le chant très éthéré se pose délicatement sur des nappes rythmiques en évolution constante, parsemées de soli cristallins. Le travail de Sean à la batterie est énorme, et les patterns déroulent à l’infini l’inspiration d’un percussionniste dont l’imagination n’a aucune limite. On poursuit notre rêve éveillé sur le splendide « Integral Birth », le morceau le plus violent de cette première moitié d’album. Il n’empêche que le pont central ou la voix de Paul prend des allures de guide céleste est un modèle de douceur. Avec ce titre, CYNIC prouve qu’il est inutile de développer sur 10 minutes des idées qui font mouche sur un format court, tout en restant certainement plus progressif que la plupart des combos se réclamant de cette appellation.
« The Unknown Guest » est un bijou d’arrangements, un diamant dont les incessants breaks forment une myriade de facettes plus pures les unes que les autres. Mais le chemin ne s’arrête pas là, et le sentier suivant, « Adam’s Murmur » serpente au travers de paysages tantôt reposants, tantôt menaçants, toute la dualité d’un groupe au style unique. Le solo est une fois de plus un modèle du genre, et le drum-kit s’affole devant tant de grâce.
Le dernier gros pavé de l’album, « King Of Those Who Know » est une fois de plus un chef d’œuvre. Plus de 6 minutes de savoir faire inimitable, alternance des climats, des couleurs, d’une voix angélique et de grognements démoniaques. Plus que des mots, il faut offrir son ouïe en obole au groupe pour tenter d’appréhender tout leur génie. Et ce final jazzy…quel beauté !
Traced In Air se clôt de la plus belle des façons, avec le miroir « Nunc Stans » (pour les non-initiés, le Nunc Stans symbolise l’éternité, par opposition au Nunc Fluens qui lui symbolise l’instant), qui reste à l’image d’un groupe au dessus de tout soupçons à tous les niveaux. Le génie de composition de Paul MASVIDAL est mis en relief de la plus belle des façons qui soit, et ceux qui l’accompagnent serait on tenté de dire, viennent ajouter leur touche personnelle à cette grâce ambiante.
On peut ne pas aimer CYNIC. Comme on peut ne pas croire à l’au-delà, au surnaturel, aux OVNIS. Comme on peut penser que la religion est une perte de temps. Que la philosophie est une escroquerie. Comme on peut penser que seul notre temps de vie sur terre à de l’importance. Que rien ne se cache dans les cieux.
Mais c’est tellement plus enrichissant de croire…Focus n’était donc qu’un premier chapitre. Traced In Air est le second.
Espérons ne pas avoir à attendre encore 15 ans pour le troisième tome…
Ajouté : Samedi 29 Novembre 2008 Chroniqueur : Mortne2001 Score : Lien en relation: Cynic Website Hits: 15501
|