|  | 
 
 | 
| 
 | |||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
|  | 
|  | Опции темы | Поиск в этой теме | Опции просмотра | 
| 
			 
			#1  
			
			
			
			
		 | ||||
| 
 | ||||
|  Массив и BASS.DLL (BASS_ChannelGetData) Вопрос такой. Код: var
buffermy1 : array of array of Single;
b : integer;
......
  SetLength(buffermy1, 129); // SetLength(buffermy1, 129, 2);
  for b := 0 to 128 do
    SetLength(buffermy1, b, 2);  
 BASS_ChannelGetData(Channel, buffermy1, BASS_DATA_FFT256 or BASS_DATA_FFT_INDIVIDUAL);Так не работает и тормоза. А если так: Код: buffermy1 : array [0..128, 0..1] of Single; b : integer; ...... BASS_ChannelGetData(Channel, buffermy1, BASS_DATA_FFT256 or BASS_DATA_FFT_INDIVIDUAL); Все прекрасно. Почему первый варифнт не работает. И еще пробовал так- же задать длинну массива, заполнить цифрами, а затем вывести в листбоксы и ве работает, а с BASS не проходит. Где ошибка? | 
| 
			 
			#2  
			
			
			
			
		 | ||||
| 
 | ||||
|   Ты передаешь указатель на массив, а не на его первый элемент. Хотя хз, эта библа то еще зло. | 
| 
			 
			#3  
			
			
			
			
		 | ||||
| 
 | ||||
|   Во итором варианте массив статичен и поэтому: BASS_ChannelGetData(Channel, buffermy1, @BASS_DATA_FFT256 or BASS_DATA_FFT_INDIVIDUAL); А есть варианты? | 
| 
			 
			#4  
			
			
			
			
		 | ||||
| 
 | ||||
|   А что получить то нужно? Дискретное преобразование Фурье? Характеристики звука? Можно попробовать дискретное вейвлет-преобразование. Оно на порядок проще чем БПФ (собственно пример реализации: https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D 0%BE%D0%B5_%D0%B2%D0%B5%D0%B9%D0%B2%D0%BB%D0%B5%D1 %82-%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D 0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5#.D0.90.D0.BB.D0 .B3.D0.BE.D1.80.D0.B8.D1.82.D0.BC_.D0.9C.D0.B0.D0. BB.D0.BB.D0.B0). Последний раз редактировалось M.A.D.M.A.N., 16.12.2014 в 21:55. | 
| 
			 
			#5  
			
			
			
			
		 | ||||
| 
 | ||||
|   Цитата: 
 | 
| 
			 
			#6  
			
			
			
			
		 | ||||
| 
 | ||||
|   Да. Но я на басс.длл уже давным давно забил. | 
| 
			 
			#7  
			
			
			
			
		 | ||||
| 
 | ||||
|   Цитата: 
  | 
| 
			 
			#8  
			
			
			
			
		 | ||||
| 
 | ||||
|   Ну так есть что по теме? Пока сделал несколко массивов. Код: buffermy128 : array [0..128, 0..1] of Single; buffermy256 : array [0..256, 0..1] of Single; buffermy512 : array [0..512, 0..1] of Single; buffermy1024 : array [0..1024, 0..1] of Single; | 
| 
			 
			#9  
			
			
			
			
		 | ||||
| 
 | ||||
|   Кто же знает что нужно. Не хочется выделять память заранее, определи массивы через type. | 
| 
			 
			#10  
			
			
			
			
		 | ||||
| 
 | ||||
|   Дак  вы так и не ответили, нужно спектр получить? | 
| 
			 
			#11  
			
			
			
			
		 | ||||
| 
 | ||||
|   Цитата: 
 | 
| 
			 
			#12  
			
			
			
			
		 | ||||
| 
 | ||||
|   Я делал так: беру вавку (с кодека, или еще как — не важно), получаю с нее информацию о каналах, битности, битрейте; далее, начинаю читать с заданной битностью окно, которое передаю в БПФ, с него получаю магнитуду, перевожу это в децибелы, выполняю квантование и получаю графический спектр. http://delphiworld.narod.ru/base/fft.html | 
| 
			 
			#13  
			
			
			
			
		 | ||||
| 
 | ||||
|   Можно также посмотреть пример Spectrum, поставляемый с библиотекой. Я его специально для Яна переводил на Дельфи и MASM. | 
| 
			 
			#14  
			
			
			
			
		 | ||||
| 
 | ||||
|   Цитата: 
 Вопрос в другом: почемуто BASS не хочет работать с Buff : array of array of single; | 
| 
			 
			#15  
			
			
			
			
		 | ||||
| 
 | ||||
|   Ну если указанный пример работает, то там используется: Код: type
  TSingleArray	= array of Single;
var
  Buf		: TSingleArray;
begin
...
    SetLength(Buf, ci.chans * SPECWIDTH);
    BASS_ChannelGetData(chan, buf, (ci.chans * SPECWIDTH * SizeOf(Single)) or BASS_DATA_FLOAT); // get the sample data (floating-point to avoid 8 & 16 bit processing) |