PDA

Просмотр полной версии : эквалайзер в MP3 плеере


DRAGOnoid
20.06.2007, 18:47
наверно у многих стоит WinAmp. Помните там был графический эквалайзер? Так вот я хотел бы сделать такой же в mp3 плеере... почитал форум и немного хелп и на уставшую голову напрограмил что то типа этого.

------------//--------------
SoundMixer.computeSpectrum(this.spectrumInfo, false, 10);
this.mc.graphics.clear();
this.mc.graphics.beginFill(0x000000);
var temp_array = new Array();
for (var i:Number = new Number(0); i < 256; i+=1) {
var t:Number = this.spectrumInfo.readFloat();
t = Math.sqrt(t*t)*40;
if (t>18) t = 18;
temp_array.push(-Math.ceil(t));
}

for (var i2:Number = new Number(0); i2<25; i2+=1) {
this.mc.graphics.drawRect(20+i2*3, 109, 2, temp_array[i2*10]);
}
--------------------//--------------------

всё работает - только что то не тот эквалайзер получился.... в винампе скачет меньше и более логичней ... т.е. я так понял там идёт показ по частотам а тут по потокам... Ну или что то в этом роде...

у меня 2 вопроса
что означает this.spectrumInfo.readFloat(); я так и не понял? :rolleyes:
а второе - не могли бы подсказать как сделать "правильный графический эквалайзер" ?:away:

etc
20.06.2007, 18:48
Поставь true во втором аргументе computeSpectrum.

DRAGOnoid
20.06.2007, 18:52
Поставь true во втором аргументе computeSpectrum.
ужс - позор мне под конец рабочего дня Оо
а что на счёт команды readFloat() ? Только плиз не говори читай хелп - я ж говорю не понял я там ничего - хотя бы тут в 2х словах :o

etc
20.06.2007, 18:58
readFloat читает 64-bit signed float. Проще говоря, число с плавающей запятой.

DRAGOnoid
20.06.2007, 19:11
кстати ща попробовал такой код - теперь более похоже на правду -


SoundMixer.computeSpectrum(this.spectrumInfo, true, 10);
this.mc.graphics.clear();
this.mc.graphics.beginFill(0x000000);
var temp_array = new Array();
for (var i:Number = new Number(0); i < 256; i+=1) {
var t:Number = this.spectrumInfo.readFloat();
temp_array.push(-Math.ceil(t*17));
}

for (var i2:Number = new Number(0); i2<25; i2+=1) {
this.mc.graphics.drawRect(20+i2*3, 109, 2, temp_array[i2*10]);
}

однако чувтсвуется не то ...

я точно ничего не пропустил?

this.spectrumInfo.readFloat(); - эта штука точно мне мозг сломает... А всё потому что до сих пор понять немогу как мы в цикле читаем из массива число с плавающей точкой Х___Х причём не гоняем по элементам массива

etc
20.06.2007, 19:39
Гоняем, гоняем. Читаем 8 байт, указатель переходит на следующее 8 байт. Общий размер массива — 2048 байт, вот мы и читаем 256*8 = 2048 байт…

DRAGOnoid
21.06.2007, 01:25
забавно получается однако... незнаю в чём глюк или фича - поставил трейс и заметил что каждый второй кадр график падает на ноль (ну или часть массива)

поставил буфферный массив который возвращает прошлое значение если данное ноль...
получился такой тупой, но вполне рабочий код:

SoundMixer.computeSpectrum(this.spectrumInfo, true, 1);
this.mc.graphics.clear();
this.mc.graphics.beginFill(0x000000);
var temp_array = new Array();
for (var i:Number = new Number(0); i < 256; i+=1) {
var t:Number = this.spectrumInfo.readFloat();
temp_array.push(-Math.ceil(t*17));
}

var tol = 4;
var shag = 25;
for (var i2:Number = new Number(0); i2<Math.floor(256/shag); i2+=1) {
if (temp_array[i2*shag]==0 && this.graphArrayOld[i2*shag]!=null) {
temp_array[i2*shag] = this.graphArrayOld[i2*shag];
this.mc.graphics.drawRect(20+i2*(tol+1), 109, tol, temp_array[i2*shag]);
temp_array[i2*shag] = 0;
}
else {
this.mc.graphics.drawRect(20+i2*(tol+1), 109, tol, temp_array[i2*shag]);
}
}
this.graphArrayOld = temp_array;
trace (this.graphArrayOld[0]);

в общем более менее я доволен :yahoo:
спасибо __etc - который в очередной раз выручил :drinks: