# 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
}
OESTRE (FRA) - La Dernière Renaissance (2014)
Label : Auto-Production
Sortie du Scud : 18 janvier 2014
Pays : France
Genre : Metal moderne
Type : Album
Playtime : 9 Titres - 46 Mins
La Dernière Renaissance, c'est comme revenir dans son quartier d'enfance après plusieurs années d'exil. Evidement, rien n'a réellement bougé. Les rues portent toujours les mêmes noms de maréchaux, de ministres ou de feuillus, les bâtiments ne se sont guères déplacés. Et pourtant, tout semble si différent. La faute peut-être à un line-up entièrement remanié par rapport à la période Catharsis. La faute peut-être aussi à cette pochette, la première d'OESTRE que je trouve particulièrement jolie. Un petit rien qui fait un grand tout, c'est probablement la raison pour laquelle ce troisième full-lenght se cataloguera après écoute comme étant le plus réussi de leur passionnante discographie. Oui mais...
Biotope (2005) : 7/10
Nature Morte (2006) : 7/10
La Piste Des Larmes (2007) : 7/10
Catharsis (2012) : 7/10
La Dernière Renaissance (2014) : 7/10
Il y a chez ces Limougeauds une forme de constance. Une constance dérangeante, puisqu'après des années d'activité, il en résulte aussi qu'OESTRE n'a jamais su provoquer l'étincelle qui ferait décoller un de ses albums plus qu'un autre. Vous avez raison, je parlais plus haut du "full-lenght [...] le plus réussi de leur passionnante discographie". Parce que maturité, luminosité, performance, complexité, puissance dans l'écriture, minimalisme dans les arrangements. Ce qui, vous en conviendrez, n'a jamais rendu aucun disque inoubliable. La Dernière Renaissance est loin d'en être. Il y a cependant un je-ne-sais-quoi de mieux qui sépare ici le correct du bon. A mi-chemin entre Metal moderne et groovy, Metal industriel, Ambiant et Rock acide, OESTRE va faire de son troisième rejeton un opus solide, construit sur des décalages rythmiques parfaitement exécutés. L'expérience acquise en côtoyant des têtes de gondoles comme GOJIRA, TEXTURES ou HACRIDE se ressent dans la sérénité dégagée. Un vrai tournant Electro s'installe à partir de "Memento", qui embraye sur la calorique "Des Sirènes Et Des Bombes". Le groupe oscille entre la pureté organique du Metal et la froideur d'arrangements synthétiques, comme il l'a toujours fait d'ailleurs, mais avec cette fois davantage de lisibilité, de sensibilité. Le grand changement, c'est l'humeur. Alors que les Limougeauds s'échinaient depuis toujours à combiner des ambiances sombres et des thèmes malsains, il se dégage de La Dernière Renaissance un optimisme tout à fait inattendu. A l'image de cette pochette qui arbore des couleurs autrement plus chaudes et stylisées que celles de La Piste Des Larmes, on reçoit à la pelle des décharges de riffs chaleureux, de structures clairvoyantes, optimisées par le timbre profond d'un Mickaël qui n'a rien perdu de sa hargne, comme en témoigne sa performance névrosée sur "Fragments Oniriques". Et constamment, toute l'humanité qu'on cherche à percevoir est remise en question par l'antipathie de quelques arrangements qui sonnent l'heure de l'artifice ("Interlude", "Le Théorème De Moebius" ...)
Combat déséquilibré entre l'Homme et ce qu'il a créé ? Peut-être pas. La Dernière Renaissance est un simple cri de jubilation qui s'affranchit de ces clivages. OESTRE a toujours prôné ce mariage que d'autres ont fait avant lui et que d'autres feront après lui. Mais avec ce troisième album ô combien solide, ces Français pugnaces, tenaces, peuvent se satisfaire d'avoir changé tant de choses sur la forme et d'être restés sur le fond si proches de l'âme d'OESTRE. Celle qui fait d'eux un groupe à la fois universel et tellement unique.
Ajouté : Lundi 02 Février 2015 Chroniqueur : Stef. Score : Lien en relation: Oestre Website Hits: 5190
|