# 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
}
JONO (se) - Life (2017)

Label : Frontiers Records
Sortie du Scud : 1 décembre 2017
Pays : Suède
Genre : Rock mélodique
Type : Album
Playtime : 10 Titres - 55 Mins
Johan Norrby, multi-instrumentaliste chevronné sans réel coup d'éclat derrière lui, a rassemblé au début de notre décennie quelques musiciens aux pedigrees variables (le guitariste Stefan Helleblad joue notamment pour WITHIN TEMPTATION), et sorti sous l'accronyme JONO deux albums en autoproduction. Requiem (2013) posait déjà les bases d'une identité musicale complexe, emprunté au Hard FM, au Rock mélodique et au Rock progressif, au gré d'influences aussi multiples qu'évidentes. Silence (2015) avait poussé plus encore cette pluralité en digérant admirablement ses inspirations (QUEEN, JOURNEY ou E.L.O.) pour aboutir à un disque aussi brillant que confidentiel. Des titres comme "Wasting Time" ou "Your Bread" donnaient alors un indice sur une suite pleine de promesses. Ce nouvel opus sobrement intitulé Life, le premier sous la bannière d'un label majeur, vient couronner un parcours jusqu'ici sans accroc.
Riche et multi-facette, le style JONO s'affirme ici avec une vraie certitude. L'ambitieuse recette inclut un sens aigu de la mélodie, un son puissant mêlé d'éléments progressifs, parfois symphoniques, mais toujours modernes et dynamiques, et une bonne dose de savoir-faire.
La voix de Johan est un atout redoutable. Elle est expressive, puissante, mais surtout versatile au possible : elle sait se faire tour à tour hargneuse, offensive puis sensible, fragile. Au sein du même morceau, elle appuie par le lead ou les choeurs les changements de décor et les brusques variations harmoniques. Compagnon fétiche de Norrby, le piano a aussi la part belle. Il ressort à merveille sur les parties plus dépouillées, participe à la construction instrumentale ("No Return"), et laisse parfois la place à des sonorités plus modernes (le clavier MUSE-esque sur "Crowns"). A la guitare, Stefan Helleblad et Léo Olsson tirent habilement leur épingle du jeu. Les parties rythmiques, du Hard Rock au jazzy, sont impeccables. Et les quelques soli, disséminés çà et là, sont de toute beauté ("No Return", la fin de "To be near you"...).
Depuis "Silence", les compos ont gagné en complexité et en épaisseur. Les morceaux les plus accessibles en terme de durée n'en comportent pas moins de multiples revirements d'ambiance, des passages plus progs, des structures agréablement déroutantes, qui contribuent au caractère du disque et à l'identité du groupe. Sans se répéter, l'album décline des titres majoritaire assez lents, qui prennent le temps de se construire ("My Love", "The Magician"), et offrent leur apogée au moment propice. Ils illustrent une exceptionnelle intelligence dans l'écriture, et un talent rare dans la création des mélodies.
Les titres plus longs, à tiroirs, regorgent de surprises. En témoigne "Down side" qui, en calmant le jeu en piano-voix à mi-morceau, installe une atmosphère intime, enrobante, avant de monter inexorablement en puissance pour un final rageur. "Trust" connait d'abord une construction classique avec un refrain assez quelconque, des choeurs imposants, puis un retour au calme, une improbable envolée vocale et une fin instrumentale emballante.
Aucune balade des précédents albums n'avait marqué les esprits. "The March" corrige magistralement ce léger regret, en toute fin de disque. Très épuré sans tomber dans la simplicité, ce titre entièrement acoustique souligne une interprétation toute en sensibilité de Johan, qui fait tinter les notes sans les bousculer. Superbe.
Voilà donc un album mature, solide. Life s'enracine dans un paysage dépeuplé, celui qui accueille l'inattendu, mais aussi l'excellence, la maîtrise et l'audace toutes en même temps. Il y restera le temps que vous le découvriez.
Ajouté : Mercredi 08 Novembre 2017 Chroniqueur : JB Score :      Lien en relation: Jono Website Hits: 8323
|