# 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
}
OCEANA (usa) - Clean Head (2010)
Label : Rise Records
Sortie du Scud : 11 mai 2010
Pays : France
Genre : Post-Hardcore / Indie Rock
Type : EP
Playtime : 4 Titres - 18 Mins
Petit moment de détente dans cet agenda de la rentrée bien chargé avec une acquisition personnelle au rapport qualité / prix imbattable : le premier EP des coreux floridiens d’OCEANA contre une pièce rouillée de deux euros. Certains préfèreraient faire un vœu devant la fontaine de Trévi que d’injecter cette somme dans un disque de Post-Hardcore et pourtant, Clean Head est ce qu’on peut trouver de mieux dans la maigre discographie de ce gros pétard mouillé qu’est OCEANA. Sorti en 2010 sous leur label historique, Rise Records, il confirme l’ascension toute relative d’une formation qui avait déjà deux opus au compteur, The Tide en 2008 et Birth.Eater en 2009. Un album par an, c’est donc le tarif minimum affiché par les ricains à l’entrée de leur boutique, chatoyant bric-à-brac d’influences à la fois modernes et vieillottes. Dans une arène Metalcore peuplée de gladiateurs en carton, OCEANA a fait le choix d’intellectualiser sa musique pour avoir lui aussi droit à son quart d’heure de rêve américain.
Un bon Rubik’s Cube, voilà ce dont il faudra vous armer pour venir à bout de cet enregistrement. Dix-huit minutes, quatre morceaux et des musiciens très talentueux mais un peu sadiques, Clean Head est composé de seulement trois éléments qui, mis dos-à-dos, aboutissent sur une sorte de Post-Hardcore bucolique, à la peau brulée par ses influences Indie Rock ensoleillées. Beaucoup de joie, beaucoup de sourires s’extirpent de cette œuvre torturée qui aurait pu faire le bonheur de n’importe quel réalisateur cherchant un groupe apte pour écrire la bande-son du nouveau « Une Nuit A New-York ». Pot-pourri de Rock alternatif, branches séchées de l’arbre Metalcore, racines épuisées de Math Rock et pistils fanés de Twee Pop, cet EP est extrêmement odorant. A tel point que si l’odorat est un repère pour l’orientation, au même titre que l’ouïe pour l’équilibre, le bouquet très riche de Clean Head vous fera localiser St-Petersburg en Floride. Hérétique, non ? OCEANA a clairement établi un nouveau cap artistique, puisque les deux albums s’inscrivaient dans une veine Post-Hardcore non-négociable. Ici, tout est chagrin mais radieux, vaporeux mais palpable, éthéré mais écrasant, séraphique mais diabolique. Cet EP est un contresens permanent aux humeurs changeantes selon les mouvements de lune. La voix douce et ambrée de Brennan Taublee offre aux Américains de nouvelles possibilités, avec des placements très hauts, jamais entendus auparavant. Rock dur et bagarreur comme sur l’intro « Wool God », Rock alambiqué et suffocant comme sur « Joy », la musique d’OCEANA me fait penser à un mariage improbable entre MOGWAI et Ben Folds. C’est dire si les noms de ces deux entités antagonistes avaient une chance infime de se retrouver un jour accolés dans une chronique. Il aura fallu attendre 2010 et Clean Head pour pouvoir se délecter d’un des Rock les plus compulsifs du nouveau millénaire. Je sais pertinemment qu’en matière de Rock, plus encore qu’en matière de Metal, les cerveaux des artistes sont en permanente ébullition. Mais je vous assure que celui d’OCEANA vaut le détour, et que cette nouvelle orientation qui je l’espère, sera durable, vaut mille fois deux disques de Post-Hardcore foirés.
Les Américains ont voulu s’éclater. Mission accomplie parce qu’on s’éclate avec eux. Je ne pense pas que ce virage artistique soit définitif. Je pense qu’il n’est qu’une parenthèse. Mais en tout cas, il nous dévoile un OCEANA radieux, probablement sous son meilleur jour. Clean Head mettra du baume au cœur dans votre quotidien. Il est de ces disques créatifs, aboutis, qui passent trop vite et qui vous plongent dans un bain de lumière pendant un examen de conscience. Recommandable donc.
Ajouté : Mercredi 12 Septembre 2012 Chroniqueur : Stef. Score : Lien en relation: Oceana Website Hits: 6868
|