# 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
}
MYGRAIN (fi) - Planetary Breathing (2013)

Label : Spinefarm Records
Sortie du Scud : 27 Septembre 2013
Pays : Finlande
Genre : Death Metal mélodique
Type : Album
Playtime : 10 Titres - 53 Mins
Pour ma première chronique, j'ai l'honneur de retrouver les finlandais de MYGRAIN. Nos compères nous avaient bluffés en 2010 avec leur album éponyme particulièrement abouti. Le groupe avait trouvé son originalité à travers un Death mélodique teinté de sonorités Electro et inspiré par la science-fiction que le groupe aime à appeler "Space Metal". Ils remettent le couvert en 2013 avec une nouvelle offrande, Planetary Breathing. Le dernier avec le guitariste Resistor qui a quitté le groupe le 21 octobre 2013 pour se concentrer sur d'autres aspects de sa vie. Il a été remplacé par Joni Lahdenkauppi. Voilà pour les dernières news sur le line-up. Concentrons-nous plutôt sur cette nouvelle livraison.
Première chose, j'ai été bluffé par l'aspect ultra-mélodique et le haut niveau technique de l'entreprise, qui se sent déjà du point de vue des guitares. Le groupe a su de nouveau mettre les petits plats dans les grands. On retrouve ici tous les éléments qui ont fonctionné sur l'album précédent. La mélodie est donc, une fois de plus, mise en avant. Les riffs sont accrocheurs et intelligemment agencés. Les différents solos qui garnissent ce full-lenght sont foutrement efficaces, pour être poli, et révèlent tout le potentiel de Resistor, Jonas (basse relayée le plus souvent en arrière-plan par la production, mais fait une petite apparition solo sur "Dreamscape" pour notre plus grand bonheur), et Teemu.
Bien évidemment, on ne peut prétendre chroniquer les Suédois sans évoquer le soin apporté par Eve Kojo sur le clavier, ou encore les arrangements électroniques. On tient ici l'originalité de MYGRAIN. Ils sont soigneusement mis en avant par la production et le mixage impeccable de Unisound, le studio de Dan Swanö (producteur pour OPETH, THEATRE OF TRAGEDY, chanteur chez THERION, STAR ONE, le projet de Lucassen, et j'en passe), déjà là sur l'album précédent. Les mélodies développées par Eve sont tout simplement sublimes. J'ai ainsi été tout simplement séduit par les intro aux claviers de "Dreamscape" et "Black Light Supernova". Elles enrichissent les différentes compositions développées sur l'album, déjà d'une qualité excellente. Leur variété rend chaque titre unique. Les arrangements électroniques nous réservent par ailleurs de jolies surprises (sons radio sur "Incantation", "Mechanical Instinct", ou la fin de "Planetary Breathing"). La batterie de Janne Manninen, elle aussi, enchaîne les blasts, accélérations ou passages plus posés avec brio. C'est propre, net et sans bavure.
Néanmoins, on pourra relever les envolées dans les aigus de "Tommy", moins convaincantes, malgré une voix hurlée et claire magnifique et la redondance du schéma couplet hurlé-refrain en clair, avec touche de chant hurlé, qui révèle l'influence SOILWORK, à quelques exceptions près ("The Final Skyline", "Ghost In Me" notamment). Les paroles évoquent le thème bateau des états torturés de l'être, auxquelles ont été néanmoins incorporés des images en référence à l'espace. Mais c'est jugé sévèrement nos Finlandais qui ne le méritent vraiment pas.
Je ne cache pas le plaisir que j'ai eu à écouter cet album. MYGRAIN, pour notre plus grand bonheur, a repris les ingrédients qui ont fonctionné en 2010 pour livrer leur album le plus abouti. Une œuvre qui ne s'émousse pas, même après plusieurs écoutes. Les hésitations de Orbit Dance ou Signs Of Existence ne sont plus présentes. J'ai découvert ce LP un soir après une longue journée de cours. Les Finlandais ont su me redonner la pêche nécessaire pour rentrer à la maison. Sur ce, je m'en vais reprendre une petite bouffée planétaire.
"9, 8, 7, 6, 5, 4, 3, 2, 1, made engine start".
Ajouté : Mercredi 26 Février 2014 Chroniqueur : Resurrected2014 Score :     Lien en relation: MyGrain Website Hits: 7368
|