Воспроизводит wav. Чем открыть файл.WAV? Дополнительная информация о формате WAV
Объявление
Формат файлов WAV Audio
Файлы WAV (WAVE) были созданы компанией IBM и Microsoft. Они содержат различные аудиоданные - звуки, звуковые эффекты, музыку, а также записи голоса. Программы проигрывания медиафайлов (Windows Media Player, QuickTime и т.п.) могут воспроизводить и открывать такие файлы. Файлы WAV значительно больше файлов MP3, и именно поэтому они не пользуются популярностью. Отличительная черта файлов WAV - их технология сжатия звука без потерь. Полученные файлы отличаются высоким качеством и большими размерами, что значительно вредит их популярности. Отправка и загрузка таких файлов требует много времени и дискового пространства.
Технические сведения о файлах WAV
Файлы WAV используют формат файлов для обмена ресурсами, с помощью которого происходит сохранение данных. Данные хранятся в кластерах, которые содержат тег из 4 символов, а также кол-во байт в кластере. Аналог данного формата для ОС Mac - файлы AIFF. Файлы WAV могут иметь семплы от 8 до 16 бит при частотах от 11 025 до 44 100 Гц. Максимальное качество файлов WAV - 16 бит, 44 100 Гц, и именно такой частотой дискретизации обладают дорожки на компакт-дисках, на которых секунда звука "весит" 88 кБ. При кодировании цифрового потока обычно используется формат линейной-импульсно-кодовой модуляции. Системные звуки в ОС Windows при запуске ОС, нажатии на ярлыки, при выдаче ошибок, выключении компьютера и т.п. представляют собой несжатые файлы WAV.
Дополнительная информация о формате WAV
Расширение файла | .wav | |||||||||||||||||||||||||||||||||||||||||||||||||||||
Категория файлов | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Файл-пример |
(6,1 MiB) (1,5 MiB) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
Связанные программы | CyberLink PowerDirector Microsoft Windows Media Player Roxio Creator 2009 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
Arduino Nano | SD карта |
---|---|
12 | MISO |
11 | MOSI |
13 | SCK |
4 | CS |
9 | динамик |
GND | GND |
5V | VCC |
Arduino Mega
Arduino Mega | SD карта |
---|---|
50 | MISO |
51 | MOSI |
52 | SCK |
53 | CS |
11 | динамик |
GND | GND |
5V | VCC |
Если тестовый код работает, то добавьте строку #include
Если звука всё равно нет, то добавьте задержку между командами воспроизведения delay(1000); .
Дополнительные возможности
Данная библиотека предназначалась для простого и удобного пользователю использования в качестве проигрывателя wav аудиофайлов, использующего стандартные библиотеки Arduino и воспроизводящего файлы в простейшем wav формате. Многие дополнительные функции были добавлены по запросам пользователей и включены в pcmConfig.h , чтобы сохранить изначальную простоту.
Большинство дополнительных функций требуют больше памяти RAM, больше программной памяти и, в некоторых случаях, большей вычислительной мощности для воспроизведения. Некоторые из них до сих пор еще отлажены не полностью. Помните об этом при включении данных функций.
Смотрите pcmConfig.h для настройки следующих параметров:
Пользовательские определения
В pcmConfig.h настраиваются следующие параметры:
Параметр | Описание |
---|---|
#define buffSize 128 | Управляет размером двух буферов (или четырех в режиме MULTI). |
#define DISABLE_SPEAKER2 | Выключает вывод по умолчанию второго динамика для совместимости с другими библиотеками (вывод 10 на Uno). |
#define ENABLE_MULTI | Включает режим воспроизведения нескольких треков (по умолчанию на одном таймере). |
#define STEREO_OR_16BIT | Включает воспроизведение стерео или 16-битных файлов. |
#define MODE2 | Включает режим двойного таймера для воспроизведения нескольких треков. Не доступен с TIMER2. |
#define SDFAT | Библиотека SdFat использует меньше памяти программ и RAM. Смотрите пример SDFAT в составе данной библиотеки. |
#define HANDLE_TAGS | Пропускает теги WAV файлов, которые содержат метаданные. |
#define USE_TIMER2 | Использует 8-разрядный TIMER2, вместо 16-разрядных таймеров. |
#define rampMega | Принудительный ручной выбор включения/выключения метода линейного изменения ШИМ. |
#define ENABLE_RF | Включает стриминг аудио через радиоканал (NRF24L01+). |
Второй громкоговоритель / двухтактный режим
Данная библиотека по умолчанию выводит данные на два вывода таймер, хотя по умолчанию полностью включен только один.
Для включения дополнительный вывод должен быть настроен на выход, например:
- Arduino Uno (один выход): audio.speakerPin = 9;
- Arduino Uno (двухтактный выход): audio.speakerPin = 9; pinMode(10,OUTPUT);
Чтобы полностью выключить второй выход, раскомментируйте в pcmConfig.h строку #define DISABLE_SPEAKER2 .
Режим Multi
Режим Multi включает одновременное воспроизведение двух треков.
Функции множественного режима немного отличаются от функций стандартного режима:
Audio.speakerPin2 = 5; // То же действие, что и в стандартном режиме, используется только с 4-выводным выходом audio.play("sound.wav"); // Воспроизвести файл на выходе 0 audio.play("sound.wav",30,1); // Воспроизвести файл, начиная с 30-ой секунды, на выходе 1 audio.play("sound.wav",0); // play(имя_файла, выход 0 или 1) определяется speakerpin или speakerpin2 audio.stopPlayback(0); // Может принимать номер выхода 0 или 1 audio.isPlaying(0); // Может принимать номер выхода 0 или 1 audio.setVolume(4,0); // Установить громкость на выходе 0 audio.volume(0,1); // Уменьшить громкость на выходе 1
- по умолчанию: использует тот же таймер и выводы, что и в обычном режиме с двухтактным выходом;
- MODE2: использует два 16-разрядных таймера и до 4-х выводов.
Использование:
- рекомендуемая частота дискретизации 16-20 кГц;
- размер буфера может быть увеличен для улучшения производительности;
- звуки, воспроизводимые одновременно, должны иметь одинаковые частоты дискретизации;
- для включения режима multi раскомментируйте определение в pcmConfig.h;
- переменная audio.speakerPin2 должна быть установлена в 4-выводном режиме для выбора дополнительного таймера / вывода, которые будут использоваться.
Упрощенные режимы:
Примечание: все 4-выводные режимы требуют платы с двумя и более 16-разрядными таймерами.
Воспроизведение стерео и 16-битного аудио
Эти режимы требуют дополнительных ресурсов и вычислительной мощности, так как с SD карты должны считываться удвоенные данные. Треки моно могут воспроизводиться в режиме стерео, но не наоборот.
В стандартном режиме:
#define STEREO_OR_16BIT В этом режиме стерео и 16-битные файлы обрабатываются одинаково, причем первый байт считывает на один выход, а второй байт - на другой. Это дает в результате стерео выход на двух динамиках, подключенных между выводом (выводами) динамика и корпусом, или один 16-разрядный выход, использующий резисторную матрицу. #define MODE2 В стандартном режиме MODE2 позволяет выводить стерео или 16-разрядный звук, используя два дополнительных вывода таймера. Таймер и выводы указываются переменой speakerPin2 . Двухтактные выводы таймера должны быть настроены на выход вручную.
В режиме Multi:
#define STEREO_OR_16BIT Включение этой опции вместе с режимом MULTI позволит воспроизводить два стерео или 16-разрядных трека на отдельных выводах таймера. Это обеспечивает выход для четырех громкоговорителей, подключенных между выводом (выводами) и корпусом, или один 16-разрядный выход для каждого трека. #define MODE2 Включение этой опции с режимом MULTI и STEREO_OR_16BIT ни на что не влияет.
Использование SDFAT
Библиотека SDFAT может использоваться для уменьшения использования оперативной памяти и памяти программ и для повышения производительности. Файлы должны быть включены в скетч. Смотрите пример в архиве с библиотекой.
Метаданные (теги ID3v2.3 и LIST)
Функции были добавлены для чтения данных о песне, артисте и альбоме из тегов ID3v2.3 и LIST в WAV файлах.
Примечание: добавление, модифицирование и редактирование метаданных поддерживает программа Audacity.
ListInfo Прочитать теги LIST в символьный буфер, возвращает длину тега. id3Info Прочитать теги ID3 в символьный буфер, возвращает длину тега. getInfo Ищет оба тега и считывает в символьный буфер, возвращает длину тега. Первым ищется ID3.
Теги для запросов:
- 0 = название песни;
- 1 = имя артиста;
- 2 = название альбома.
Синтаксис:
Byte length = audio.listInfo(
- Найти только информацию LIST и напечать название песни через последовательный порт. char info; audio.listInfo("song.wav",info,0); Serial.print(info);Serial.println(":");
- Найти информацию ID3v2.3 и LIST и напечатать информацию о песне, артисте и альбоме через последовательный порт. char info; char* titles = {"Now Playing: ", "by: ", "Album: "}; for(int i=0; i<3; i++) { if(audio.getInfo("song1.wav",info,i) > 0) { Serial.print(titles[i]); Serial.println(info); } } audio.play("song1.wav");
Использование TIMER2
Часто данная библиотека используется с платами Uno, Nano и т.д. только с одним 16-разрядным таймером. Когда TIMER1 необходим для других целей, для воспроизведения аудио может быть использован TIMER2.
Выводы динамика - на Uno, Nano и т.д. только вывод 3.
Для включения использования 8-разрядного TIMER2 раскомментируйте строку #define USE_TIMER2 в секции пользовательских определений.
Примечания:
- этот вариант, как правило, является не самым лучшим решением;
- скорость воспроизведения будет слегка отличаться от использования 16-разрядных таймеров;
- воспроизведение на TIMER2 поддерживает нестандартные частоты дискретизации: 31,4 кГц, 23,5 кГц и 15,7 кГц;
- увеличение частоты дискретизации включено по умолчанию и в этом режиме не может быть изменено;
- рекомендуются частоты дискретизации 24-32 кГц при размере буфера 128.
ШИМ и опция rampMega
В попытках уменьшить шумы треска, создаваемые ШИМ, было опеределено четыре основных источника проблемы:
- включение ШИМ/таймеров на Arduino;
- выключение ШИМ/таймеров на Arduino;
- разница в значениях между треками;
- парсинг незвуковых данных.
- 1 и 2. При тестировании на платах Arduino Duemianove и Mega я обнаружил необходимость в разных методах линейного изменения при включении и выключении. Надеюсь, это решит проблему на большинстве других плат.
- 3. Код линейного изменения между треками не меняется. При воспроизведении треков с разными частотами дискретизации используйте функцию disable() для выключения таймеров между изменениями. Смотрите также #4.
- 4. Опция HANDLE_TAGS включена в pcmConfig.h , чтобы обеспечить правильное воспроизведение wav-файлов с включенными метаданными (ID3 или LIST).
Простое цифровое создание WAV файлов
Данные функции будут генерировать стандартные WAV файлы. Исходные данные с аналоговых входов или других датчиков могут быть записаны в файл для генерации цифрового звука, который может быть воспроизведен на любом устройстве, поддерживающем WAV файлы, или легко конвертирован в другие форматы.
Примечание: в дальнейшем будут добавлены и другие форматы wav.
Синтаксис:
Audio.createWavTemplate(
Использование:
Смотрите пример, включенный в библиотеку. Создайте файл шаблона, затем запишите в него данные, начиная с 44 байта. Используйте команду finalizeWavTemplate , чтобы добавить данные о размере файла перед воспроизведением.
Примечания: Если указанный файл существует, он будет перезаписан при создании, но обновлен только при завершении. Эти функции при использовании функций записи вызываются автоматически.
Запись звука
Запись звука находится всё еще в тестировании и может работать не так, как ожидается.
Функции:
StartRecording Начать запись с указанного аналогового вывода. stopRecording Остановить запись и финализировать wav файл.
Проходной режим - во время записи выдает звук на динамик.
Режимы: 0 - нормальный/нет; 1 - динамик включен; 2 - записи нет, вывод только на динамик.
Синтаксис:
Audio.startRecording(
Использование:
- раскомментируйте #define buffSize 128 и #define ENABLE_RECORDING в pcmConfig.h ;
- начните запись audio.startRecording("sound.wav",16000,A0);
- остановите запись audio.stopRecording("sound.wav");
Примечания:
- для записи рекомендуется библиотека SdFat;
- рекомендуются SD карты минимум класса 4;
- возможно, понадобится увеличение buffSize .
Продолжение урока затянулось, оно и понятно, пришлось освоить работу с картами памяти и файловой системой FAT. Но все таки, оно свершилось, урок готов — фактически новогоднее чудо.
Дабы не перегружать статью информацией, я не буду описывать структуру формата wav файла, информации в поисковиках более чем предостаточно. Достаточно сказать, что если открыть файл, каким либо Hex редактором, то в первых 44 байтах содержится вся информация о типе файла, частоте дискретизации, количестве каналов и пр. Если нужно анализировать файл, читайте этот заголовок и будет вам счастье.
Полезные данные начинаются с 44 байта, по сути они содержат уровни напряжений, из которых формируется звук. Мы уже говорили про ступени напряжения, в прошлой части урока. Таким образом, все просто, нужно эти ступеньки вывести на динамик с частотой дискретизации файла.
Как физически заставить динамик дрыгаться? Нужно выводить эти уровни напряжения, при помощи ШИМ, либо использовать R2R. В любом случае, использовать очень просто, прочитал число, засунул его либо в OCR, либо в PORTx. Далее через определенное время, подставил следующее значение и так до конца файла.
Пример, некий wav файл, данные идут с 44=0х2С байта, там записано число 0х80, воспроизводим звук например ШИМом первого таймера, пишем OCR1A=0х80; Допустим, частота дискретизации вавки 8кГц, соответственно прерывание должно быть настроено на эту же частоту. В прерывании, подставляем следующее значение 0x85 через 1/8000=125мкс.
Как настроить прерывание на 8кГц? Вспоминаем, если таймер работает на частоте 250кГц, то регистр сравнения прерывания нужно подставить (250/8)-1=31-1 или 0x1E. С ШИМом тоже все просто, чем выше частота на которой он работает тем лучше.
Чтобы прошивка работала, условимся, что флешка отформатирована в FAT32, используется либа PetitFat из урока 23.2. Файл в формате wav либо 8кГц, либо 22,050кГц, моно. Название файла 1.wav. Анализируем прошивку.
#include |
#include
Для проверки, на ножку OCR1A подключаем динамик через конденсатор 100мкФ, «+» на ножку микроконтроллера, «-» на динамик. «-» динамика на землю, «+» на конденсатор.
Не ждите громкого сигнала на выходе, чтобы звучало громко, необходим усилитель. На видео это хорошо видно. Для теста залил петуха 8кГц и трек 22кГц.
Желающие могут смело увеличить частоту таймера2, чтобы проигрывать файлы 44кГц, опыты показывают, что можно добиться вполне неплохого качества звучания. На видео звук слабый и качество плохое, но на самом деле это из-за того, что снимал на фотоаппарат.
Также выкладываю материалы любезно предоставленные Аппаратчиком — исходник для GCC, с которого была написана прошивка под CAVR.
И видео с воспроизведением 44кГц.
Пользуясь случаем поздравляю Всех с Наступающим, желаю чтобы все прошивки и девайсы у вас работали 🙂
Проект wav плеера на Atmega8