Разложение wav/mp3 файла для заливки в дуину
- Войдите на сайт для отправки комментариев
Добрый день!
Для использования ф-ии tone в дуине нам необходимы массивы частоты и длины "волны", поиграясь с простым примером toneMelody из папки Digital все станет ясно, но забивать руками эти массивы не камильфо. Вот я и задался вопросом автоматизации процесса, возможно, есть готовые библиотеки или приложения, на вход которым подаем wav/mp3 файл, а на выходе получаем нужные массивы?
Я решил начать с моего любимого Матлаба. Сразу находим нужную функцию wavread('C:/wav_file.wav'), на выходе получим следующее:
>> [y, Fs, nbits] = wavread('C:/m.wav'); >> size(y) ans = 89823 2 >> size(Fs) ans = 1 1 >> size(nbits) ans = 1 1
Значения переменных:
Fs =22050, nbits = 8. Тут все ясно, а вот пример переменной y (в эту переменную загрузили файл):
0 0 -0.0078 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.0078 -0.0078 0 0 0 -0.0078 0 0 0 0 0 0 0 0 0 -0.0078 0 0 0 0 0 -0.0078 0
Что это за магические цифры?
Описание функции wavread и параметров:
y = wavread(filename) loads a WAVE file specified by the string filename, returning the sampled data in y. If filename does not include an extension, wavread appends .wav.
[y, Fs] = wavread(filename) returns the sample rate (Fs) in Hertz used to encode the data in the file.
[y, Fs, nbits] = wavread(filename) returns the number of bits per sample (nbits).
[y, Fs, nbits, opts] = wavread(filename) returns a structure opts of additional information contained in the WAV file. The content of this structure differs from file to file. Typical structure fields include opts.fmt (audio format information) and opts.info (text that describes the title, author, etc.).
И пример из матлаба, который создает wav файл из файла handel.mat, затем проигрывает его.
Код файла handel.mat:
open handel.mat ans = y: [73113x1 double] Fs: 8192 >> y(1:100) ans = 0 -0.0062 -0.0750 -0.0312 0.0062 0.0381 0.0189 -0.0250 -0.0312 -0.0750 -0.1258 -0.1443 -0.1812 -0.1905 -0.0750 -0.0127 -0.0381 -0.0750 0 0.0750 0.1258 0.1812 0.1505 0.1258 0.0812 0.0566 0 -0.0627 -0.0950 -0.0381 -0.0062 -0.0189 -0.0750 -0.0950 -0.0750 -0.0750 -0.0312 -0.0566 -0.0189 0.0250 0.0566 0.0566 0.0250 -0.0189 0.0250 0.1074 0.1258 0.0812 0.0312 0.0062 -0.0312 0.0062 -0.0062 0.0250 0.1197 0.1505 0.1628 0.1628 0.0504 0
Код алгоритма:
% Create WAV file in current folder. load handel.mat hfile = 'handel.wav'; wavwrite(y, Fs, hfile) clear y Fs % Read the data back into MATLAB, and listen to audio. [y, Fs, nbits, readinfo] = wavread(hfile); sound(y, Fs); % Pause before next read and playback operation. duration = numel(y) / Fs; pause(duration + 2) % Read and play only the first 2 seconds. nsamples = 2 * Fs; [y2, Fs] = wavread(hfile, nsamples); sound(y2, Fs); pause(4) % Read and play the middle third of the file. sizeinfo = wavread(hfile, 'size'); tot_samples = sizeinfo(1); startpos = tot_samples / 3; endpos = 2 * startpos; [y3, Fs] = wavread(hfile, [startpos endpos]); sound(y3, Fs);
Подведу итог: поняв магию этих чисел, можно перевести вавку в массив и закинуть на ардуину, затем проиграть вавку через ардуину. Mp3-шеилд не интересен, хочется поиздеваться таким путем. Спасибо за внимание.
Интерес представляют вот эти строки:
[y, Fs, nbits, readinfo] = wavread(hfile);
sound(y, Fs);
и ф-ия sound, вот ее код:
SOUND(Y,FS) sends the signal in vector Y (with sample frequency FS) out to the speaker on platforms that support sound. Values in Y are assumed to be in the range -1.0 <= y <= 1.0.
Что за вектор то такой, этот Y? Нормирование от -1 1 до 0 20000 дает бредовый результат.