Ciao a tutti,
vorrei realizzare un karaoke che in qualche modo alla fine dell'esecuzione confronti due tracce audio.
Mi spiego meglio: la base dovrebbe essere un file midi, poi una persona canta e alla fine della canzone l'applicazione dovrebbe confrontare le due tracce e dirmi quanto è stata accurata la persona che ha cantato per esempio restituendo una percentuale di accuratezza.
Qui sotto vi riporto il codice con cui acquisisco due file mp3 e ne stampo il grafico.
codice:
public function MainSuono():void
{
snd1.load(new URLRequest("record1.mp3"));
snd2.load(new URLRequest("record2.mp3"));
snd1.addEventListener(Event.COMPLETE, Caricato);
snd2.addEventListener(Event.COMPLETE, Caricato);
}
public function Caricato(e:Event):void
{
var bArray:ByteArray = new ByteArray();
var lun:Number = Math.floor((e.target.length / 1000) * 44100);
e.target.extract(bArray, lun);
var step:int = bArray.length / 256;
var alt:Number = 0;
bArray.position = 0;
var vet:Vector.<Number> = new Vector.<Number>();
for (i = 0; i < 256; i++ )
{
vet[i] = bArray.readFloat();
bArray.position = i * step;
}
stampaGrafico(vet);
indice+=400;
}
public function stampaGrafico(v:Vector.<Number>):void
{
var curva:Sprite = new Sprite();
addChild(curva);
curva.graphics.clear();
curva.graphics.moveTo(4, 200 + indice);
if (indice == 1)
{
curva.graphics.lineStyle(3, 0xCCFFAA);
curva.name = "Pino";
arrey.push(v);
}
else
{
curva.graphics.lineStyle(3, 0x00CCEE);
curva.name = "Nino";
arrey.push(v);
}
for (i = 0; i < 256; i++ )
{
curva.graphics.lineTo(i,(200+indice) - (v[i] * 300));
curva.graphics.endFill();
}
curva.addEventListener(MouseEvent.CLICK, Play);
}
Il mio problema è quindi il confronto delle due tracce, io ho pensando di scorrere il vettore che contiene le tracce e confrontarne i valori, quindi fare un delta tra i valori della prima traccia e quelli della seconda.
Spero di essermi spiegato e che qualcuno riesca ad aiutarmi magari utilizzando gli elementi che ho gia, altrimenti potete suggerirmi qualche tutorial (anche in inglese).
Grazie in anticipo