Комментарии 36
А что использовали для спектрограммы? Недавно сталкивался с подобной задачей, и не нашел ни одного удобного инструмента для анализа звука.
Использовался банальный foobar2000 с компонентом Musical Spectrum
Для спектрограммы можно использовать амплитудный спектр (модуль по комплексному массиву после быстрого преобразования фурье). А если его брать в пределах некоторого скользящего по времени «окна» — то как раз каждый очередной спектр в новом положении «окна» — будет меняться по сравнению с предыдущим положением, прямо как в видео в посте. Что может быть удобнее, чем написать это самому (взяв готовую математическую библиотеку с БПФом). Хотя, конечно, это более мудрёно, чем готовые решения.
Смотрел на этот вариант. Остановила необходимость подгонять входные-выходные данные для стороннего БПФ-а (в каких-то библиотеках есть коэффициент 1/N, в каких-то нет, к примеру, ну не доверяю я сторонним математическим библиотекам), а свой БПФ на момент задачи не осилил. А сейчас вот так смотрю, и думаю, видимо придется все-таки свой БПФ писать.
Не хочу никого обидеть, но стиль программирования просто ужасен.
Начиная от циклов, заканчивая подряд идущими write'ами, игнорированием интерфейса IDisposable, «доскладыванием» числа на много строк и изобилием магических чисел.
Начиная от циклов, заканчивая подряд идущими write'ами, игнорированием интерфейса IDisposable, «доскладыванием» числа на много строк и изобилием магических чисел.
Вполне нормальный стиль. Ему важна была идея, а не то что Вы скажете о его стиле. Все ваши претензии высосаны из пальца.
А вообще вам сюда:
habrahabr.ru/post/178747/
Статья отличная!
А вообще вам сюда:
habrahabr.ru/post/178747/
Статья отличная!
Заранее сказал — не хочу никого обидеть. Если бы я писал текст статьи БоЛьШиМи и МаЛеНьКиМи буквами, кого бы интересовала идея, изложенная в ней?
Это если бы Вы писали. А так вы пока еще ничего не писали.
У него с регистром все в норме. Вы опять придираетесь!
У него с регистром все в норме. Вы опять придираетесь!
С регистром — обычная аналогия, не стоит понимать буквально.
Я не пишу по одной простой причине — я не вижу в этом смысла. Не вижу я что могу поведать что-то важное, пока что.
Писать на хабр очередное «как мы собрали старт-ап», «как я собрал сервер», «какую я написал очередную тривиальную программу», «какой алгоритм я использовал для смыва унитаза», «моя история успеха», «Как Google делает очки», «как борются корпорации», «ответ на ужасающий по своей безграмотности другой пост», «как оптимизировать так чтобы читать было невозможно», «как я расписал предельно ясное слово из википедии на целую статью», «как я перепечатал текст из MSDN», «в каких тайландах/китаях/кореях я побывал» и прочую муть, не вижу смысла — это не дает абсолютно никакого знания. Как поразительно, что эта псевдоинтеллектуальщина — большая часть местного населения.
Я не пишу по одной простой причине — я не вижу в этом смысла. Не вижу я что могу поведать что-то важное, пока что.
Писать на хабр очередное «как мы собрали старт-ап», «как я собрал сервер», «какую я написал очередную тривиальную программу», «какой алгоритм я использовал для смыва унитаза», «моя история успеха», «Как Google делает очки», «как борются корпорации», «ответ на ужасающий по своей безграмотности другой пост», «как оптимизировать так чтобы читать было невозможно», «как я расписал предельно ясное слово из википедии на целую статью», «как я перепечатал текст из MSDN», «в каких тайландах/китаях/кореях я побывал» и прочую муть, не вижу смысла — это не дает абсолютно никакого знания. Как поразительно, что эта псевдоинтеллектуальщина — большая часть местного населения.
«большая часть местного населения» к сожалению, да и все остальные тоже, не так умны как Вы. они должны почитать вас и приносить Вам дары. Вы никогда не увидите ничего важного, никогда не напишите, а вот критиковать стиль и темы будете всегда. Так устроены многие люди.
Писать про очередное:
«как мы собрали старт-ап» — а вы собирали?
«как я собрал сервер» — может собирали реальный нормальный сервер? я не говорю про «игрушки»
«моя история успеха» — а была ли?
«какой алгоритм я использовал для смыва унитаза» — это действительно хорошая тема! Если кто возьмется написать, буду благодарен. Запланируйте на пятницу!
«в каких тайландах/китаях/кореях я побывал» — бывали? это действительно интересно. многие статьи раскрывают такие мелочи, которых не узнаешь ни по каким познавательным каналам.
Писать про очередное:
«как мы собрали старт-ап» — а вы собирали?
«как я собрал сервер» — может собирали реальный нормальный сервер? я не говорю про «игрушки»
«моя история успеха» — а была ли?
«какой алгоритм я использовал для смыва унитаза» — это действительно хорошая тема! Если кто возьмется написать, буду благодарен. Запланируйте на пятницу!
«в каких тайландах/китаях/кореях я побывал» — бывали? это действительно интересно. многие статьи раскрывают такие мелочи, которых не узнаешь ни по каким познавательным каналам.
Я не наталкивал никого к мысли о том что я «умнее». Но это псевдоинтеллектуально. Ваши высказывания сродни фразам, «сначала добейся, потом говори». Это смешно, как бы вы меня тут не минусовали. И, подчеркну, я не скажу, что я этого не делал.
Я считаю, что все что вы перечисляете здесь «выборочно» есть самые обычные вещи. Просто кто-то их делает, а кто-то делает и пишет статью. Только вот проблема — учить надо не тому, что всем итак ясно, а тому, что людям в действительности открывает глаза на что-то новое.
Я считаю, что все что вы перечисляете здесь «выборочно» есть самые обычные вещи. Просто кто-то их делает, а кто-то делает и пишет статью. Только вот проблема — учить надо не тому, что всем итак ясно, а тому, что людям в действительности открывает глаза на что-то новое.
Да не стиль программирования был целью, я попытался написать так чтобы даже новичок понял суть написанного. Поэтому и раскладывал числа на много строк использовал страшноватый BitConverter с foreach вместо чего то подобного
stream.WriteByte((byte)(data[i] & 0xff)); stream.WriteByte(unchecked ((byte)(data[i] >> 8)));
.Если бы вы хотели именно этого, тогда бы вы разделили это
На несколько читаемых элементов.
Вы бы использовали директиву using чтобы было наглядно видно где закончилось чтение стрима
Вы бы использовали константы чтобы как-то «обличить» ваши магические числа.
А вот такой код:
С числами 75, 76, 75, которые в сути одно и тоже, циклом зачем-то начинающимся с единицы, чтобы потом в теле цикла счетчик приходилось вычитать по-вашему упрощают суть?
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? Какие уже готовые библиотеки (желательно бесплатные) порекомендуете использовать?
Отличная статья, очень понравилось. Вопрос автору: а как в вашей программе реализовано проигрывание? Вы проигрываете wav-файл, или же есть возможность проигрывать массив данных, который вы создаете?
Стандартными средствами. Да проигрываем wav-файл (он отличается на 44 байта от нашего массива) впрочем читать его можно из MemoryStream. Теоретически можно доработать поддержку скажем DirectSound.
Попытался запустить проект в Mono под OS X, звук не воспроизводится. Попробую хотя бы в файл сохранить.
При рассмотрении подобных задач думаю, что не зря ходил в универ на цифровую обработку сигналов.
Спасибо очень познавательно!
Спасибо очень познавательно!
Кто интересуется ещё вот и вот… ещё было суперское видео по этой теме на Clojure, забыл где видел — там прям в реал-тайме мужик разрабатывал крутую композицию + небольшую графику к ней.) И я сейчас не про эту запись… еще была клевая =)
Bal des Ardents // Benoît and the Mandelbrots — live coding laptop band
Когда-то баловался с физическим программным синтезом звуков музыкальных инструментов. Даже что-то получилось. Вот это действительно интересно.
Содержание статьи напомнило Play-Notes на powershell и A toy piano на tcl.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Для работы со звуком на С# есть неплохая библиотека NAudio и видеоуроки по ней.
Вот только чистая синусоида звучит очень уныло! Глухо и невыразительно.
Добавьте гармоник! Хотя бы квинту-октаву. Или сразу возьмите пилу вместо синусоиды.
У реального инструмента «чистой» ноты нет, есть спектр частот. На той же гитаре можно ударить струну возле 12-го лада и получить ту же унылую синусоиду. А можно щипнуть почти возле подставки и получить насыщенный «металлический» звук с кучей гармоник.
Добавьте гармоник! Хотя бы квинту-октаву. Или сразу возьмите пилу вместо синусоиды.
У реального инструмента «чистой» ноты нет, есть спектр частот. На той же гитаре можно ударить струну возле 12-го лада и получить ту же унылую синусоиду. А можно щипнуть почти возле подставки и получить насыщенный «металлический» звук с кучей гармоник.
НЛО прилетело и опубликовало эту надпись здесь
Я в своё время подобную задачу решал на ZX-Spectrum, just for fun.
Началось с того, что припаял 8-разрядный ЦАП и выделил порт. И понеслась…
Разумеется, ни о каком real-time просчёте синусоиды там не могло быть и речи. Вместо этого заранее просчитывалась таблица сэмплов (на бейсике :). и в цикле (на ассемблере) я просто складывал циклически эти сэмплы и гнал результат на ЦАП.
Мелодия (многоголосная) записывалась буквенно-цифровой нотацией, каждые 4 ноты — один аккорд.
Например, C-dur — как C1E1G1C2 — и т.д.
И вроде всё было идеально — программа выверена по тактам, никаких задержек и шероховатостей. Но вот звук был просто кошмарным. Потребовалось несколько дней, чтобы понять, что это всё из-за того, что в качестве сэмпла использовалась банальная синусоида!
Началось с того, что припаял 8-разрядный ЦАП и выделил порт. И понеслась…
Разумеется, ни о каком real-time просчёте синусоиды там не могло быть и речи. Вместо этого заранее просчитывалась таблица сэмплов (на бейсике :). и в цикле (на ассемблере) я просто складывал циклически эти сэмплы и гнал результат на ЦАП.
Мелодия (многоголосная) записывалась буквенно-цифровой нотацией, каждые 4 ноты — один аккорд.
Например, C-dur — как C1E1G1C2 — и т.д.
И вроде всё было идеально — программа выверена по тактам, никаких задержек и шероховатостей. Но вот звук был просто кошмарным. Потребовалось несколько дней, чтобы понять, что это всё из-за того, что в качестве сэмпла использовалась банальная синусоида!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Программный синтезатор