Как стать автором
Обновить

Комментарии 36

А что использовали для спектрограммы? Недавно сталкивался с подобной задачей, и не нашел ни одного удобного инструмента для анализа звука.
Тоже совсем недавно сталкивался и в этом направлении очень помогла эта статья.
Использовался банальный foobar2000 с компонентом Musical Spectrum
Для спектрограммы можно использовать амплитудный спектр (модуль по комплексному массиву после быстрого преобразования фурье). А если его брать в пределах некоторого скользящего по времени «окна» — то как раз каждый очередной спектр в новом положении «окна» — будет меняться по сравнению с предыдущим положением, прямо как в видео в посте. Что может быть удобнее, чем написать это самому (взяв готовую математическую библиотеку с БПФом). Хотя, конечно, это более мудрёно, чем готовые решения.
Смотрел на этот вариант. Остановила необходимость подгонять входные-выходные данные для стороннего БПФ-а (в каких-то библиотеках есть коэффициент 1/N, в каких-то нет, к примеру, ну не доверяю я сторонним математическим библиотекам), а свой БПФ на момент задачи не осилил. А сейчас вот так смотрю, и думаю, видимо придется все-таки свой БПФ писать.
Не хочу никого обидеть, но стиль программирования просто ужасен.
Начиная от циклов, заканчивая подряд идущими write'ами, игнорированием интерфейса IDisposable, «доскладыванием» числа на много строк и изобилием магических чисел.
Вполне нормальный стиль. Ему важна была идея, а не то что Вы скажете о его стиле. Все ваши претензии высосаны из пальца.

А вообще вам сюда:
habrahabr.ru/post/178747/

Статья отличная!
Заранее сказал — не хочу никого обидеть. Если бы я писал текст статьи БоЛьШиМи и МаЛеНьКиМи буквами, кого бы интересовала идея, изложенная в ней?
Это если бы Вы писали. А так вы пока еще ничего не писали.

У него с регистром все в норме. Вы опять придираетесь!
С регистром — обычная аналогия, не стоит понимать буквально.
Я не пишу по одной простой причине — я не вижу в этом смысла. Не вижу я что могу поведать что-то важное, пока что.
Писать на хабр очередное «как мы собрали старт-ап», «как я собрал сервер», «какую я написал очередную тривиальную программу», «какой алгоритм я использовал для смыва унитаза», «моя история успеха», «Как Google делает очки», «как борются корпорации», «ответ на ужасающий по своей безграмотности другой пост», «как оптимизировать так чтобы читать было невозможно», «как я расписал предельно ясное слово из википедии на целую статью», «как я перепечатал текст из MSDN», «в каких тайландах/китаях/кореях я побывал» и прочую муть, не вижу смысла — это не дает абсолютно никакого знания. Как поразительно, что эта псевдоинтеллектуальщина — большая часть местного населения.
«большая часть местного населения» к сожалению, да и все остальные тоже, не так умны как Вы. они должны почитать вас и приносить Вам дары. Вы никогда не увидите ничего важного, никогда не напишите, а вот критиковать стиль и темы будете всегда. Так устроены многие люди.

Писать про очередное:
«как мы собрали старт-ап» — а вы собирали?
«как я собрал сервер» — может собирали реальный нормальный сервер? я не говорю про «игрушки»
«моя история успеха» — а была ли?
«какой алгоритм я использовал для смыва унитаза» — это действительно хорошая тема! Если кто возьмется написать, буду благодарен. Запланируйте на пятницу!
«в каких тайландах/китаях/кореях я побывал» — бывали? это действительно интересно. многие статьи раскрывают такие мелочи, которых не узнаешь ни по каким познавательным каналам.
Я не наталкивал никого к мысли о том что я «умнее». Но это псевдоинтеллектуально. Ваши высказывания сродни фразам, «сначала добейся, потом говори». Это смешно, как бы вы меня тут не минусовали. И, подчеркну, я не скажу, что я этого не делал.
Я считаю, что все что вы перечисляете здесь «выборочно» есть самые обычные вещи. Просто кто-то их делает, а кто-то делает и пишет статью. Только вот проблема — учить надо не тому, что всем итак ясно, а тому, что людям в действительности открывает глаза на что-то новое.
Да не стиль программирования был целью, я попытался написать так чтобы даже новичок понял суть написанного. Поэтому и раскладывал числа на много строк использовал страшноватый BitConverter с foreach вместо чего то подобного stream.WriteByte((byte)(data[i] & 0xff)); stream.WriteByte(unchecked ((byte)(data[i] >> 8)));.
Если бы вы хотели именно этого, тогда бы вы разделили это
result =  0.5 * Sine(position, frequency) ;
result += 0.4 * Sine(position, frequency / 4);
result += 0.2 * Sine(position, frequency / 2);
result *= Length(compressor, frequency, position, length, sampleRate) * short.MaxValue * 0.25;
result += data[index];

На несколько читаемых элементов.

Вы бы использовали директиву using чтобы было наглядно видно где закончилось чтение стрима

Вы бы использовали константы чтобы как-то «обличить» ваши магические числа.

А вот такой код:
        double[] data = new double[75]; // Инициализируем массив.
        for (int index = 1; index < 76; index++) { // Вычисляем данные для всего массива.
            data[index-1] = Sine(index, Math.PI * 2 * 2.0 / 75); // Период разделенный на частоту дискретизации.
        }

С числами 75, 76, 75, которые в сути одно и тоже, циклом зачем-то начинающимся с единицы, чтобы потом в теле цикла счетчик приходилось вычитать по-вашему упрощают суть?
Вы просто не понимаете что значит этот код и зачем он так разделен. Именно в таком виде он и читабельный и показывает что результирующая волна состоит из пропорционально сложенных волн основной, смещенный на одну октаву и смещенной на две октавы, после чего я показываю что глушу волну привожу его к амплитуде short.MaxValue, а 0.25 это громкость. Это не решение данной задачи а попытка показать как вобще синтез звука устроен.
Никаких числе магических нет, это не готовый проект, а заготовка для отработки техники.
А смещаем мы цикл просто для одной цели чтобы подправить округление чисел для красоты картинки, или по вашему это от фонаря написано?
Друзья, а у кого есть материалы по синтезу звука на Objective-C с использованием Core Audio? Какие уже готовые библиотеки (желательно бесплатные) порекомендуете использовать?
Есть хорошая бесплатная книга: iZotope iOS Audio Programming (в iBooks можно бесплатно скачать). Радует, что она от реальной фирмы, разрабатывающей музыкальные приложения.
Отличная статья, очень понравилось. Вопрос автору: а как в вашей программе реализовано проигрывание? Вы проигрываете wav-файл, или же есть возможность проигрывать массив данных, который вы создаете?
Стандартными средствами. Да проигрываем wav-файл (он отличается на 44 байта от нашего массива) впрочем читать его можно из MemoryStream. Теоретически можно доработать поддержку скажем DirectSound.
Попытался запустить проект в Mono под OS X, звук не воспроизводится. Попробую хотя бы в файл сохранить.
Да, в файлике всё ок работает.
А проигрывает он звук с помощью библиотеки winmm.dll, не мудрено что на маке ее нет…
При рассмотрении подобных задач думаю, что не зря ходил в универ на цифровую обработку сигналов.
Спасибо очень познавательно!
Статья интересная, но справедливости ради стоит сказать, что для реализации достаточно только школьных знаний математики и физики.
Кто интересуется ещё вот и вот… ещё было суперское видео по этой теме на Clojure, забыл где видел — там прям в реал-тайме мужик разрабатывал крутую композицию + небольшую графику к ней.) И я сейчас не про эту запись… еще была клевая =)
Bal des Ardents // Benoît and the Mandelbrots — live coding laptop band
Когда-то баловался с физическим программным синтезом звуков музыкальных инструментов. Даже что-то получилось. Вот это действительно интересно.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Вот только чистая синусоида звучит очень уныло! Глухо и невыразительно.
Добавьте гармоник! Хотя бы квинту-октаву. Или сразу возьмите пилу вместо синусоиды.
У реального инструмента «чистой» ноты нет, есть спектр частот. На той же гитаре можно ударить струну возле 12-го лада и получить ту же унылую синусоиду. А можно щипнуть почти возле подставки и получить насыщенный «металлический» звук с кучей гармоник.
НЛО прилетело и опубликовало эту надпись здесь
Я в своё время подобную задачу решал на ZX-Spectrum, just for fun.
Началось с того, что припаял 8-разрядный ЦАП и выделил порт. И понеслась…
Разумеется, ни о каком real-time просчёте синусоиды там не могло быть и речи. Вместо этого заранее просчитывалась таблица сэмплов (на бейсике :). и в цикле (на ассемблере) я просто складывал циклически эти сэмплы и гнал результат на ЦАП.
Мелодия (многоголосная) записывалась буквенно-цифровой нотацией, каждые 4 ноты — один аккорд.
Например, C-dur — как C1E1G1C2 — и т.д.
И вроде всё было идеально — программа выверена по тактам, никаких задержек и шероховатостей. Но вот звук был просто кошмарным. Потребовалось несколько дней, чтобы понять, что это всё из-за того, что в качестве сэмпла использовалась банальная синусоида!
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории