gammaker
> В том случае, который ты привёл, у меня бы нота посередине пропала, а первая
> нота имела бы длину 10.
а предполагается что должно быть две: 0-10, 10-20.
> А разве вообще могут одинаковые ноты звучать одновременно на одном канале?
Хотя у себя я посмотрел, я стараюсь такие ноты раскидывать по разным каналам.
Aroch
> да, в этом нет никакой проблемы.
А как это возможно физически на музыкальном инструменте\MIDI-клавиатуре сделать? Нельзя же нажать клавишу несколько раз, не отпуская её, а потом отпустить несколько раз?
gammaker
можно регулировать силу нажатия, after touch, но это не совсем то и для этого отдельное событие есть. Не все что можно сохранить в миди можно сыграть на реально инструменте как и наоборот, как пример миди файлы на миллионы нот )
По поводу проблемы выше, на одном канале и треке несколько подряд note on для одной и той же клавиши не должно быть, но на деле та ситуация с нулевой длиной ноты временами бывает.
Проверил браузерную версию на Raspberry Pi 2. Учитывая JS (пусть и asm.js), 1 ядро, используемое синтезатором, 900 МГц (без разгона), ожидал увидеть ужасную производительность, абсолютно не совместимую со стримингом, но оказалось всё не так страшно. Одна из самых тяжёлых MIDI - ABBA Mamma Mia генерировалась в 2 раза быстрее, чем воспроизводилась. При реалтаймовом синтезе подтормаживает только в моменты, когда генерируются новые семплы через IFFT. Оно занимает примерно 20% времени всего синтеза, но распределено очень неравномерно - при первой встрече новой ноты. Если придумать, как распределить нагрузку, можно наверное избавиться от подтормаживаний.
Скорость синтеза примерно в 15 раз медленнее, чем на ноуте с Core i7. И этот коэффициент почти не отличается на разных MIDI, которые я пробовал.
Интересно, а SoundFont'ы она бы потянула?
Выпустил новую версию, переделал многие музыкальные инструменты, улучшил баланс громкостей. Как всегда синтезатор можно послушать в браузере на моём сайте. Пополнил коллекцию новыми MIDI, среди которых есть пара новогодних.
Сегодня 31 декабря - самое время подвести итоги 2017 года по моему синтезатору. В этом году произошёл огромнейший прорыв в качестве синтезируемых инструментов, который я сам не мог предсказать. Он произошёл благодаря статье, которую я случайно нашёл в интернете, в которой был описан очень интересный метод синтеза с помощью IFFT.
Кроме того было добавлено стерео и pitch bend.
Предлагаю послушать и сравнить самим. Слева ссылки на сегодняшнюю версию. Справа - версия начала года.
1) Merry Christmas (старая версия)
2) Три Белых Коня (старая версия)
3) Jingle Bells (старая версия)
4) ABBA - Happy New Year (старая версия)
Планы на следующий год:
1) Экспоненциальная ADSR.
2) Вынести описание инструментов из кода в JSON файл с горячей перезагрузкой при сохранении - это очень сильно ускорит разработку, которая сейчас сводится к многократному изменению цифр, перекомпиляции и перезапуску синтезатора
3) Реализовать перемотку.
4) Сделать версию, максимально использующую API WebAudio. Она будет самой компактной и, возможно, быстрее за счёт нативной C++ реализации в браузере с использованием SIMD инструкций, которые пока недоступны из asm.js и WebAssembly.
5) Попробовать перенести синтезатор на GPU, может быть даже прямо в браузере через WebGL. Большинство операций, которые используются в синтезаторе, хорошо ложатся на GPU.
6) Сделать больше разных ударников.
7) Развить дальше субтрактивный синтез и попытаться скрестить его с уже используемыми методами синтеза. Сейчас им только гитара сделана и она пока не идеальна.
8) Сделать, наконец, что-то более похожее на фортепиано.
9) Развивать сайт, сделать GUI синтезатора, где можно включать и выключать дорожки, менять им инструменты, настраивать громкость инструментов и создавать новые инструменты.
10) Сделать возможность играть прямо на обычной или MIDI-клавиатуре в реальном времени. Но здесь не будет профита от пункта 5, потому что никакой батчинг в реальном времени сделать не получится.
Немного послушал в студии.
Явно улучшились оркестровые скрипки, Voice, гитара, а вот в колокольчиках чрезмерно убита атака. Стало явно лучше в плане ритма, раньше на некоторых композициях инструменты разъезжались, возможно, из-за неправильной/не вовремя атаки.
Где бочка-малый-томы? Это самое главное. В барабанах слышу только хет, не плох (как делал?), только через-чур срезана низкая середина.
Mikle
> а вот в колокольчиках чрезмерно убита атака.
Под колокольчиками ты имеешь в виду Vibraphone, Marimba, и т.п.? Сейчас работаю над ними.
Mikle
> Где бочка-малый-томы? Это самое главное.
Я не очень разобрался с MIDI редактором - как там смотреть в MIDI, какие есть ударники. Мне казалось, что в MIDI из тех ударников, реализации которых ты выкладывал, их не так много было. Но надо ещё посмотреть. Как вообще в MIDI эти ударники называются?
Как раз в ближайшее время собираюсь заняться ударниками. Только пока для меня тёмный лес, как они делаются. Начну с твоих реализаций из темы по синтезу музыкальных инструментов.
Mikle
> В барабанах слышу только хет, не плох (как делал?), только через-чур срезана
> низкая середина.
Это я переписал твой код с VB. Там только твоя физическая модель, без фильтров. Не знаю, каким образом там могло оказаться что-то срезано.
Ещё хочу доделать гитару. Высокие ноты как-то не очень звучат, слишком пискляво. Предполагаю, что это из-за того, что у них период короче и усредняющий фильтр запускается чаще. У тебя видимо это решается тем, что ты используешь период одинаковой длины с линейной интерполяцией.
Кстати, можно ли этим методом Карплюс-Стронга получить overdriven и distortion гитару? А то у меня сейчас все виды гитар в MIDI звучат одинаково.
Ещё думаю подумать над эффектами. Вот например реверберация как делается, отдельно на каждую ноту накладывается или уже на готовую музыку постпроцессом?
gammaker
> Как вообще в MIDI эти ударники называются?
http://computermusicresource.com/GM.Percussion.KeyMap.html
> Ещё хочу доделать гитару. Высокие ноты как-то не очень звучат, слишком
> пискляво.
она еще и слишком тихо звучит, поставь например у себя свист + гитару, громкость у свиста будет намного больше.
Можешь воспользоваться для экспериментов если хочешь flo_rida-whistle, тут и ударные и гитара довольно сильно влияют на общее восприятие.
Aroch
> Можешь воспользоваться для экспериментов если хочешь flo_rida-whistle, тут и
> ударные и гитара довольно сильно влияют на общее восприятие.
У меня есть уже такая: https://gammaker.github.io/midisynth/?~./Flo%20Rida%20-%20Whistle
А свист заглушает из-за того, что он сам громкий. Я многим инструментам громкость убавлял в процессе экспериментов, а про свист забыл.
Хотя да, мне не удалось пока подобрать такую громкость гитары, чтобы она была не была где-нибудь слишком тихой или громкой. Текущая громкость мне показалась неплохим компромиссом.
Aroch
> тут и ударные и гитара довольно сильно влияют на общее восприятие.
Здесь тихие какие-то ударные и мало их. Не знаю, как они влияют. Мне попадались MIDI, где была целая куча ударных.
Aroch
> http://computermusicresource.com/GM.Percussion.KeyMap.html
Я не могу сопоставить русские названия английским. С томами ещё понятно, но что из этого "бочка"? И что такое "малый"?
gammaker
> С томами ещё понятно, но что из этого "бочка"? И что такое "малый"?
http://fdstar.com/music_terms/rus_B/
> Здесь тихие какие-то ударные и мало их.
нормальные ударные, просто у тебя их вообще не слышно, но как я понял ты ударные еще особо и не реализовывал.
з.ы. про какой миди редактор шла речь? Ссылку если есть (посмотреть для себя).
gammaker
> как там смотреть в MIDI, какие есть ударники
Главные те, что расположены на 10-м миди-канале.
Основное:
35-36
Бочка, №36 - стандарт, №35 часто ниже.
37
Кромка малого барабана
38
Малый барабан (жирный звук)
39
Хлопок в ладоши
40
Малый барабан (сухой звук)
41, 43, 45, 47, 48, 50
Томы от низкого к высокому.
42
Закрытый хай-хет
44
Педаль хай-хета
46
Открытый хай-хет
49
Crash
Акцентовая тарелка
51
Ride тарелка
52
Чайна
53
Ride тарелка, удар около центра (больше колокольности)
54
бубен
55
Splash
Маленькая акцентовая тарелка
56
Cowbell
Ковбелл
57
Акцентовая тарелка
58
Vibra Slap
Переводится "вибрирующий хлопок", звучит как-то странно.
59
Ride тарелка 2
gammaker
> Под колокольчиками ты имеешь в виду Vibraphone, Marimba, и т.п.? Сейчас работаю
> над ними.
Те, что в Jingle Bells
gammaker
> Вот например реверберация как делается, отдельно на каждую ноту накладывается
> или уже на готовую музыку постпроцессом?
Ни то, ни другое. Ревер, хорус и т. п. эффекты накладывают на миди канал.
gammaker
> можно ли этим методом Карплюс-Стронга получить overdriven и distortion гитару?
Это пост-эффекты.
Ограничь обычную гитару, можно сигмой, можно вообще клампом.
Aroch
> нормальные ударные, просто у тебя их вообще не слышно
Я в синтезаторе винды запускал. У себя понятно, я бы и не услышал)
Aroch
> з.ы. про какой миди редактор шла речь? Ссылку если есть (посмотреть для себя).
Я использую, какой первый попался - Anvil Studio. Не очень удобный, надо другие поискать.
Mikle
> Основное
Спасибо, теперь понятно.
Mikle
> Те, что в Jingle Bells
Вроде сделал получше, но пока не заливал на сайт.
Mikle
> Ни то, ни другое. Ревер, хорус и т. п. эффекты накладывают на миди канал.
А почему только на канал? Разве реверберация не действует одинаково на все инструменты в пределах одного помещения?
Mikle
> Это пост-эффекты.
> Ограничь обычную гитару, можно сигмой, можно вообще клампом.
Ок, попробую.
Спасибо всем за критику и ответы. На днях залью новую версию, надо только ещё что-нибудь сделать.
gammaker
> Разве реверберация не действует одинаково на все инструменты в пределах одного помещения?
Во-первых, музыку пишут из соображений сделать красиво, а не естественно.
Во-вторых, даже из соображений естественности, это не так, всё зависит от взаимного расположения источника и приёмника звука. Чем источник ближе к приёмнику, тем больше прямого звука попадёт в приёмник, в то время как реверберация практически не зависит от этого.
Правильнее описать работу ревербератора так: реверберация направляется непосредственно в микс, но на вход ревербератора попадает смешанный сигнал разных каналов, где уровень инструмента в миксе равен произведению уровня громкости этого миди-канала на уровень реверберации этого же миди-канала.
У меня в демке Cool был не RealTime, поэтому я сначала сводил не в стерео, а в три канала, левый, правый и "на ревер", потом вторым проходом канал "на ревер" отправлял на вход ревера, а выход раскидывал на L-R.
gammaker
> Ок, попробую.
Плохо, что в Карплюс фазы гармоник строго кратны, при обработке distortion не получается тех "переливов". Сейчас попробую записать пару звуков, чтобы уточнить, что я имею ввиду.
Записал.
Вот пример: [sound=129996]
Тут четыре звука:
1. Сумма синусов 300 и 600 герц.
2. Сумма синусов 300 и 602 герц.
3. Сумма синусов 300 и 600 герц, далее дисторшн.
4. Сумма синусов 300 и 602 герц, далее дисторшн.
Второй звук от первого почти не отличается на слух, в то время как четвёртый от третьего отличается сильно. Та же разница будет у Карплюс против живого звука, даже когда он очень хорошо звучит, после дисторшна он сильно "помертвеет".
Mikle
> на уровень реверберации этого же миди-канала.
А откуда брать этот уровень реверберации? Он может прямо в MIDI задаваться? Есть какое-то событие MIDI, которое за это отвечает? Вроде не гуглится.
Mikle
> Плохо, что в Карплюс фазы гармоник строго кратны
А почему так получается? Усредняющий фильтр как-то сводит все фазы вместе? Или в одном коротком периоде нельзя задать разные фазы гармоник?
Ещё такой вопрос. У меня генерируется много периодических семплов длиной 16384+. Ноту я составляю зацикливанием этих семплов и могу переиспользовать их для нескольких нот одинаковой высоты. Можно ли как-то заставить этот периодический звук эволюционировать, постепенно всё сильнее гася высокие частоты, при этом не модифицируя сам период, как в Карплюс-Стронге? Может есть какой-то дешёвый фильтр для этого? В идеале хотелось бы, чтобы имея константный периодический семпл, двигаться по нему по кругу, параллельно записывая обработанный фильтром результат в выходной массив - один проход без каких-либо никаких промежуточных массивов. И по мере прохода фильтр должен модифицироваться так, чтобы отсекать всё больше и больше высоких частот.
Тема в архиве.