Comments 39
нарисовать фолну
Поправьте в первом предложении.
Почему struct.unpack не пользовали, а нампи?
Да, можно парсить через struct, не спорю. Но я где-то читал (к сожалению, не помню, где), что mathplotlib заточена под numpy, выше производительность по сравнению со стандартными списками. И кроме того, если со звуком будут выполняться какие-либо манипуляции (нормализация, фильтры, компрессия, преобразования Фурье), то лучше numpy-массивов ничего лучше быть не может.
Да, тем более что scipy.io.wavfile как раз возвращает numpy array.
Пробывал scipy.io.wavfile, у меня почему-то выдавало ошибку на некоторых файлах. Решил отложить scipy на потом.
Спасибо!
P.S: В скрипте удалите «r» в первом param:
P.S: В скрипте удалите «r» в первом param:
wav = wave.open(r«music.wav», mode=«r»)
Хороший выбор средств.
А вообще мне очень нравится, что с wave работать легко и просто, например нормально (для любых wav) повернуть звук задом наперёд занимает всего примерно 10 строк.
А вообще мне очень нравится, что с wave работать легко и просто, например нормально (для любых wav) повернуть звук задом наперёд занимает всего примерно 10 строк.
В модуле wave есть класс для записи wav-файла. В гугле можно найти примеры, как генерируют вейвы с шумом на основе random. А как читать звук с девайсов, к сожалению, не знаю.
Читать можно, например, с помощью pymedia.audio.sound. В tutorial есть пример voice recoder.
440 гц :) = до, вроде так, не помню уже
там кучу гармоник еще делать, звучание струны + отражения других струн ну и реверберация внутри коробки.
Забейте, в наше время хиты делаются коктейлем white trash poser + autotune
там кучу гармоник еще делать, звучание струны + отражения других струн ну и реверберация внутри коробки.
Забейте, в наше время хиты делаются коктейлем white trash poser + autotune
Интересно, а звук в питоне получать со звуковухи можно? То есть, реально ли написать, например, тюнер с помощью каких-то уже реально существующих библиотек, как это сделано тут?
Слушайте, в этом скрипте нужно загружать весь файл в память… Соответственно очень большие файлы так не обработаешь ибо память закончится.
Можно-ли как то переделать на потоковую обработку? Считывать и обрабатывать пофреймово допустим...?
Можно-ли как то переделать на потоковую обработку? Считывать и обрабатывать пофреймово допустим...?
content = wav.readframes(nframes)
прочтите сколько надо фреймов, меняйте переменную nframes под количество байт в нем, читайте, принудительно удаляйте объекты или перезаписывайте буфер content.
прочтите сколько надо фреймов, меняйте переменную nframes под количество байт в нем, читайте, принудительно удаляйте объекты или перезаписывайте буфер content.
Это я заметил, но мне кажется что будут проблемы с калибровкой высоты графика, ведь нужно макс. амплитуду знать чтобы разрешение по Y оси задать…
Можно в 2 прохода сделать конечно, но не очень приятная перспектива.
Можно в 2 прохода сделать конечно, но не очень приятная перспектива.
256^sampwidth чтоль? Переменная peak?
Если да, то ок, принимается. (Что за магическая константа 256?)
Хотя исходный скрипт довольно сильно переделывать придется. Надо будет заняться на досуге.
А matplotlib умеет данные по кусочкам принимать? (хотя после разрежения
Да, надо будет заняться на досуге…
Если да, то ок, принимается. (Что за магическая константа 256?)
Хотя исходный скрипт довольно сильно переделывать придется. Надо будет заняться на досуге.
А matplotlib умеет данные по кусочкам принимать? (хотя после разрежения
channel = channel[0::k]
там объем данных очень сильно сократится, так что главное ДО процедуры разрежения все потоково проделать)Да, надо будет заняться на досуге…
peak — это пиковое значение амплитуды. Зная, сколько байт выделяется под один сэмпл, можно высчитать ее максимальное значение: 256 (макс. амплитуда для 1 байта) возвести в степень числа байт на сэмпл и разделить пополам.
А по поводу чтения по кусочкам — совершенно верно, но это уже дальнейшая оптимизация.
А по поводу чтения по кусочкам — совершенно верно, но это уже дальнейшая оптимизация.
А есть возможность получить громкость в дб в определённый момент времени? Грубо говоря сделать цикл от 0 сек до 60 сек?
По коду похоже, что внутри конкретного фрейма и канала цифры обозначают только амплитуду. Как (и где) тогда в wav-файле хранится распределение по частотам?
Распределение по частотам нигде не хранится, эти данные извлекаются аналитически. Сейчас работаю над этим.
Гуглите по словам «wave frequency analyze»
Гуглите по словам «wave frequency analyze»
Не гуглил, но кажется понял. У нас распределение по частотам образуется изменением амплитуды во времени (по фреймам). То есть, если нам нужна скажем одна волна частотой 1КГц, мы можем завести по 2000 фреймов в секунду и в каждом фрейме менять знак амплитуды. Так можно задать произвольную комбинацию волн, складывая амплитуды, соответствующие каждой волне, в каждом фрейме (а получить волны «обратно» можно каким-нибудь преобразованием Фурье).
А вы пробовали работать с 24-битными файлами? python.wave ведет себя странно — sample width == 3, но len(sample.readframes(1)) == 6
Похоже на баг библиотеки
Похоже на баг библиотеки
Sign up to leave a comment.
Рисуем волну .wav-файла