# 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
}
LYCANTHROPY (br) - Beware (2011)
Label : Auto-Production
Sortie du Scud : 1er janvier 2011
Pays : Brésil
Genre : Blackened Thrash Metal
Type : EP
Playtime : 4 Titres - 14 Mins
Le site Metal-Archives ne recense pas moins de onze groupes sur Terre qui ont choisi pour patronyme LYCANTHROPY ! Savoir qu’ils sont brésiliens restreint considérablement les possibilités de confusion. Ceux-là nous arrivent droit de la microrégion d’Ituiutaba, située dans l’Etat du Minas Gerais. Vous voilà plus avancés, j’en suis certain ! Avec Beware, un premier EP qui succède à la démo Run While You Can (2009), nos loups-garous poursuivent leur fulgurante ascension dans le paysage Metal brésilien. LYCANTHROPY ne connaît désormais plus la notion de frontière et ne demande qu’à s’exporter dans le monde, de tourner avec les plus grands groupes, blablabla et blablabla. Un discours qu’on ne connaît que trop bien. Si l’effort est certes louable bien que ses chances d’aboutir dérisoires, la mise en œuvre l’est un peu moins. Jugez plutôt.
Le trio ouvre sa démo avec une petite intro, ma foi pas trop mal foutue, dans un esprit très latino. Percussions tribales, notes de guitares inquiétantes et des vocalises ritualistes, on se croirait invités à une messe noire en plein cœur de la forêt amazonienne. C’est triste à dire mais « Augenmord » est probablement la meilleure des créations qui compose cette démo. Ça, on ne le sait pas encore. « M.I.N.D » déboule et détruit complètement cette atmosphère pesante et lugubre qu’avait commencé à instaurer l’intro. La qualité sonore de cette dernière laissait espérer les mêmes ressources pour les morceaux. Il n’en est rien. Le son devient soudainement granuleux et impersonnel. LYCANTHROPY pourrait quand même se payer le luxe de s’offrir une batterie correcte et un batteur qui ne soit pas en carton-pâte. Les cymbales sonnent comme un vieux grillage rouillé martyrisé par un gamin et les toms comme des seaux en plastique. Le rendu en devient donc totalement amateur. Musicalement, les brésiliens s’orientent vers un Thrash très sec et saccadé, fortement influencé par le Black des années 90. Le chant de Bald, éraillé, se rapprochant d’ailleurs de celui d’Abbath (IMMORTAL) à certains endroits. Seulement, il n’a nulle consistance et nul effet. Soutenu fréquemment par les chœurs de Laurencce (guitare) et Silas (basse), notre chanteur avance à tâtons, avec une maitrise approximative des growls et du scream. LYCANTHROPY ne se montre pas du tout convaincant mais laisse aussi entrevoir quelques fulgurances comme un interlude instrumental au cœur de « Illusory Foundations » ou une ouverture groovy sur l’éponyme, qui a du mal à cacher les ambitions du groupe, à savoir en faire le hit absolu de cette galette. Pour une démo qui ne comporte que trois chansons, je trouve assez déplorable de s’ennuyer si rapidement. On a vite fait de comprendre que les sud-américains essayent de marcher sur les traces de leurs ancêtres, sans grand succès. Dernière petite réflexion, j’aimerais bien connaître la substance consommée par le rédacteur des paroles, qui, en plus de s’exprimer dans un anglais grammaticalement hésitant, pond des phrases sans queue ni tête. Comment peut-on sérieusement prétendre chanter de telles incohérences ?
En résumé, LYCANTHROPY est donc un groupe pas très méchant, qui a essayé, une fois, deux fois, de faire comme les autres et qui s’est vautré, parce que sa musique est terriblement rébarbative, imprécise et en manque de relief. Ce n’est pas bien grave, puisqu’on en entendra jamais plus parler. Ce qui m’inquiète un peu plus, c’est que ces garçons ont l’air de prendre ça très au sérieux et de s’y croire. Alors que dans le fond, ils feraient mieux de voir la musique comme une passion, avec l’idée très précise qu’à l’heure actuelle et à leur niveau, il faudrait mieux renoncer à espérer en vivre…
Ajouté : Mardi 18 Octobre 2011 Chroniqueur : Stef. Score : Lien en relation: Lycanthropy Website Hits: 7990
|