# 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
}
SEPTENTRION (FRA) - Of An Oath (2011)

Label : Auto-Production
Sortie du Scud : 18 décembre 2011
Pays : France
Genre : Black / Folk Metal
Type : Démo
Playtime : 7 Titres - 30 Mins
SEPTENTRION est de ces formations attirantes au premier coup d’œil. On aura vite fait de mettre provisoirement de côté leurs penchants avoués pour le Black / Thrash pour s’intéresser à un visuel des plus intriguant. Logo en caractères runiques incluant une représentation sommaire de l’Yggdrasil mais surtout, une très jolie pochette, tirée du tableau « La Bataille De Poitiers » par Charles De Steuben en 1837. Pour l’anecdote, cet affrontement sanglant qui s’est déroulé en l’an 732 a vu la défaite des armées musulmanes face aux troupes françaises de Charles Martel. On évitera bien évidement d’en tirer des interprétations foireuses, préférant nous concentrer sur l’esthétisme remarquable de cette œuvre, même s’il apparaît clair que SEPTENTRION porte une attention toute particulière aux symboles, aux spiritualités et aux traditions. Engagés, nos franciliens ? Eux seuls peuvent le dire. Mais avec cette première démo qui répond au doux nom d’Of An Oath, ils le sont, au moins musicalement.
Je vous le disais, nos français évoluent donc dans un registre Black / Thrash mélodique, pour ne pas dire mythologique. Après une introduction très romanesque, très religieuse à grands renforts de pianos et d’orgues, explose « Chapitre I – At The End Of My Journey ». Aussi ai-je oublié de préciser que cette démo se compose comme un livre, de chapitres. Un Black Metal assez froid et résonnant s’échappe de ce cocon confortable. Le mid-tempo introductif classieux laisse vite l’espace à des rythmiques plus chevaleresques, guidées par le chant éraillé assez classique de Morne. Ces premiers instants sont très plaisants. Un interlude médiéval, un break un peu catchy et quelques growls viennent aérer une création moite sur laquelle on entend surtout les instrumentistes. La séduction opère assez vite et plutôt discrètement. Les chapitres suivants marquent un retour progressif à la réalité, car les imperfections y sont plus nombreuses. Le feeling change un peu sur « Creatures » qui table davantage dans la brutalité gratuite sans oublier de mettre en valeur la facette virtuose des guitares. Nous sommes en présence d’un titre un peu trop convenu à mon goût, bien que son exécution soit précise. Même topo sur « La Mort Agreste » malgré une aliénation vocale plus marquée. Globalement, on aurait bien aimé que SEPTENTRION joue encore plus à fond la carte du cliché Viking, avec pourquoi pas l’introduction d’une guitare folk et de quelques passages un peu plus festifs, à l’image de « Neant », une instrumentale (trop) posée qui fait son petit effet. Seulement voilà, les franciliens semblent s’épanouir dans la rigueur de cet hiver qui n’en finit plus. La musicalité des riffs tranche avec les réverbérations vocales et le jeu de basse spontané de Macabre, qui aboutissent à un mélange un peu complexe de Black, de Viking, de Folk mais jamais… de Thrash comme annoncé. Moi qui trouvais que leur étiquette stylistique collait assez mal au visuel qu’ils arboraient, me voilà un peu plus rassuré sur la cohérence du projet. Car il faut bien le dire, Of An Oath est une démo complètement cohérente, plutôt travaillée et qui regorge de subtilités, comme ce chant plaintif de très bonne facture sur « Völundr’s Chant ». Encore un peu granuleux et poussif à certains endroits, il dévoile cependant un groupe indéniablement talentueux.
Comme souvent, les petits groupes français ne déçoivent pas. SEPTENTRION se veut impliqué et appliqué. Il n’en ressort certainement pas un album exempt de tout défaut, ni même une prestation réjouissante. Cependant, si certains préfèreront se rabattre sur les valeurs sûres du courant, ils feraient mieux de se montrer un peu moins dédaigneux avec des français qui possèdent dans leur jeu de bien beaux atouts, à commencer par une personnalité aux contours déjà bien dessinés. Sur ce, je crois qu’ils peuvent continuer sereinement leur petit bonhomme de chemin.
Ajouté : Mardi 21 Février 2012 Chroniqueur : Stef. Score :    Lien en relation: Septentrion Website Hits: 10898
|