# 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
}
PRIMORDIAL (ie) - The Gathering Wilderness (2005)

Label : Metal Blade Records
Sortie du Scud : 7 Février 2005
Pays : Irlande
Genre : Pagan Metal épique
Type : Album
Playtime : 7 Titres - 59 Mins
Organique.
Puissant.
Mélancolique.
Intriguant.
Aboutissant à la dépendance.
Essentiel à votre vie.
PRIMORDIAL.
Il n'y a pas de mot assez fort pour décrire exactement The Gathering Wilderness.
Pour votre serviteur qui a découvert PRIMORDIAL avec To The Nameless Dead (2007), tout est à présent plus clair grâce à The Gathering Wilderness. Une sorte de prémisse, en fait, le prolongement d'une genèse, ou plutôt d'une évolution constante.
Ceux qui ne souhaitent pas aller plus loin avec ce groupe n'en saisiront jamais la substance. Ils diront vulgairement que chez PRIMORDIAL, tout se ressemble, tout est beaucoup trop long.
Les autres s'en imprègnent chaque jour, à chaque nouvelle écoute, obsédés par le Metal épique et hors-norme du combo mené par l'énigmatique Alan Averill Nemtheanga.
Fidèle à ses principes, et notamment comme sur Spirit The Earth Aflame (2000) et Storm Before Calm (2002), PRIMORDIAL met au monde 7 titres intenses dont la durée minimale ne se situe pas en dessous des 7 minutes. De sa patte aisément identifiable, c'est le guitariste Ciaran Mac Uiliam qui compose la plupart des trames et structures des chansons. Le batteur Simon O'Laoghaire ajoute ce côté tribal, oppressant et guerrier. La basse de Pol Mac Amlaigh joue sur les harmonies avec les guitares de Mac Uiliam et Michael O'Floinn. Chaque titre, qui pourrait se perdre dans un tourbillon de répétitions, se veut constamment renouvelé au possible, plein de nouveaux arrangements et bouleversant l'auditeur.
Quant à Alan Nemtheanga, que dire de plus si ce n'est qu'il vit et souffre ses textes, comme le dit mon ami Stef ? Le bonhomme insuffle un vent de révolte sur The Gathering Wilderness, que son chant soit clair, revendicatif, plaintif ou même parfois très proche du Black Metal comme aux débuts de PRIMORDIAL.
Car PRIMORDIAL n’a en rien oublié ses racines. Quand les groupes de Black tentent de composer une musique plus « mainstream » tout en conservant une voix de démon, le quintet irlandais fait tout le contraire. Ainsi sur « The Song Of The Tomb », sur fond de riffs typiquement Black, Alan chante de sa voix la plus pure ses frères tombés et les enfants devenus esclaves. Les peaux de O’Laoghaire, elles, résonnent comme un ultime salut, presque militaire, aux disparus et aux opprimés.
The Gathering Wilderness est un disque qui monte en puissance et dont la connotation dramatique se révèle de plus en plus palpable, au point d’en devenir étouffante. Les arpèges planantes et hypnotisantes du titre éponyme dressent le décor, comme une représentation théâtrale où ces mélodies à deux guitares symboliseraient la destinée d’un héros malheureux. On ressent sur « End Of All Times », aux similitudes frappantes avec « The Song Of The Tomb », que la tension monte encore d’un cran.
Le désespoir est à son comble quand survient « The Coffin Ships ». Après plus de 3 minutes d’introduction instrumentale mêlant arpèges pleines de reverb et guitares tragiques, la voix d’Alan et le magnifique thème qui l’accompagne se résument en un mot : c’est bien de désespoir dont il s’agit.
Bien que la prod’ de Billy Anderson rende le tout quelque peu « compressé », ce que Nemtheanga regrettera au point de renier les nouvelles technologies d’enregistrement, elle joue un rôle plus qu’important dans ce climat si marquant.
PRIMORDIAL dédie respectueusement The Gathering Wilderness à Quorthon (Tomas Forsberg), leader de feu BATHORY. Réécoutez donc les passages les plus épiques de Blood Fire Death (1988), et vous comprendrez que nos cinq Irlandais de PRIMORDIAL, encore plus avec cet album, s'imposent comme les dignes héritiers du solitaire Suèdois disparu en 2004. Et puis un peu de CANDLEMASS aussi, quand même …
Avec The Gathering Wilderness, qu’on ne nous dise plus que le Metal ne procure pas d’émotions.
La tristesse est souvent d’une beauté indéfinissable …
Ajouté : Samedi 28 Février 2009 Chroniqueur : NicoTheSpur Score :      Lien en relation: Primordial Website Hits: 14447
|