Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Программирование звука музыкальных инструментов (16 стр)

Программирование звука музыкальных инструментов (16 стр)

Поделиться

Страницы: 1 2 3 4 ... 15 16 17 18 Следующая

MikleМодераторwww9 авг. 201714:30#225
sti-hi
> А как это сделано?
Тут описана струна, есть ссылка на исходник на VB6:
http://www.gamedev.ru/flame/forum/?id=180947&page=67#m991
Колокол примерно так же, только массивы двумерные, фактически, это физическая эмуляция плоского колокола.
sti-hiПользовательwww9 авг. 201715:30#226
Спасибо, обожаю такие вещи.
А результат вполне соответствует общей идее - 1. полученная запись явно периодична 2. форма звука меняется от периода к периоду.
Конечно, хочется найти алгоритм этого изменения более простой, чтобы не нужно было прибегать к моделированию физических процессов.
Хотя использование физической модели само по себе интересное дело.
Вот тут я грузики на пружинках раскачивал - http://www.proza.ru/2016/10/03/1428
Дм.
FordPerfectПостоялецwww9 авг. 201715:37#227
Mikle
>На сколько сложно добавить в твой инструмент Static переменные? Чтобы они первый раз при старте инициализировались нулями, а между следующими вызовами сохраняли свои значения, многие расчёты можно сильно упростить, интегрируя численно то, что сложно интегрировать аналитически.
Есть хак с использованием слайдеров на запись. Его foxes нашёл.
В теме 96k есть код.

Правка: 9 авг. 2017 15:38

FordPerfectПостоялецwww9 авг. 201720:11#228
Mikle
if(typeof(H)!="object") // Initialization
{
  H={};
  H.cnt=0;
}

// Output
++H.cnt;
return sin(H.cnt/100);
MikleМодераторwww9 авг. 201720:20#229
FordPerfect
> лучше/хуже?
Атака усиливается, но не на всех частотах, его можно поставить на регулятор:
y=y-a1*a1*a1*(y*y*y*(pow(a1,1/4)-a1*y*y))*(B-0.5)*8;
На отрицательных бывает получается интереснее.

FordPerfect
> H.cnt
Проверил, H.cnt не целочисленный, отлично!

Правка: 9 авг. 2017 20:26

}:+()___ [Smile]Постоялецwww10 авг. 20171:49#230
Mikle
> Причём плоскости этих колебаний в реальной струне плавно вращаются вокруг Z, это хорошо заметно на глаз.
Это просто частоты поперечных поляризаций немного не совпадают и относительная фаза плавает.
sti-hiПользовательwww10 авг. 20177:59#231
Я разобрался с алгоритмом для рояля, который здесь приводился.
Что любопытно, если слагаемые v1 и v2 - положительный и отрицательный пички, обуженные в зависимости от f
см. рисунок - https://yadi.sk/i/7NlBUZXu3LrxpX
то  v0 это не что иное как квазиобертон, точно такой, какой можно видеть в этой статье -
http://www.proza.ru/2017/04/25/939 на рисунке вверху справа.
Я очень доволен этим обстоятельством, прямо мои идеи работают.
Кое что из этого алгоритма постараюсь взять для усовершенствования сценария, а может быть и сам алгоритм отдельно использую, он неплохо в общую программу встраивается. Интересно по быстродействию будет сравнить.
Дмитрий
MikleМодераторwww10 авг. 20178:40#232
sti-hi
Там на VB6 несколько проще, огибающие амплитуд вычисляются простым умножением, а не степенью:
Private Sub GenPiano()
  Dim i As Long, v0 As Double, v1 As Double, v2 As Double
  Dim a1 As Double, da1 As Double
  Dim a2 As Double, da2 As Double
  Dim g As Double

  g = 3200 / Freq
  a1 = 1
  da1 = 1 - Freq * 0.000000025
  a2 = 1
  da2 = 1 - Sqr(Freq) * 0.000009
  For i = 0 To SizeN - 1
    a1 = a1 * da1
    a2 = a2 * da2
    v0 = Sin(i * TFreq)
    v0 = Sin(v0 * g * a1 * a1 * a1 * 0.9) * v0 * v0 * 0.375
    v1 = Sin(i * TFreq * 0.499 - 0.57)
    v1 = (v1 * v1) ^ (a1 * g + 1)
    v2 = Sin(i * TFreq * 0.501 + 0.57)
    v2 = (v2 * v2) ^ (a1 * g * 3 + 1)
    ArN(i) = (v0 + v1 - v2) * (a1 + a2)
  Next i
End Sub
Это заполнение всего массива ArN(i), а не вычисление одного семпла.
С использованием того, что написал FordPerfect в п.228, и на jsfiddle.net можно будет так же сделать.
Для ускорения можно синус заменить фейковым на параболах, только я обычно период синуса заменяю не двумя отрезками квадратичной параболы, а одним кубической (y = x - x^3).
Степени при таком подходе внутри цикла не остаётся, больше ничего тяжёлого, должно быть достаточно быстро.

Правка: 10 авг. 2017 8:55

FordPerfectПостоялецwww10 авг. 201713:38#233
Я продублирую ссылку, чтобы искать быстрее: https://jsfiddle.net/nak6h7jq/embedded/result/ .
sti-hiПользовательwww10 авг. 201715:41#234
Забавно, но о существовании в Турбо Бейсике оператора возведения в степень a^b я просто забыл. Во всю мою жизнь в вычислительной практике он мне был не нужен. В крайнем случае я использовал exp(b*ln(a))
Вспомнил случайно, используя умножения для возведения в целочисленную степень. Если число одинаковых сомножителей больше 3-х, то оператором возведения в степень пользоваться предпочтительней.
Замена функции sin на две параболы (и склеивание их) ускоряет счёт не сильно, всего в полтора раза.
Но это из Турбо Бейсика. Если на ассемблере писать, то убыстрение может оказаться существеннее.
В настоящее время у меня стерео запись Трио - трёх одновременно звучащих инструментов, каждый с аккордами и эхом, идёт в 3 раза дольше, чем звучание самой записи. И это терпимо. Правда компьютер у меня не самый новый, с другой стороны пишу я не на скорости 44100 а на 32000 - так уж исторически вышло. На стандарт можно перейти, но писать дольше будет, а выгод никаких.
Но, конечно, проблема скорости синтеза звука существует.
Не знаю, как устроены профессиональные синтезаторы, но как-то они с этим справляются.
Дмитрий
SuslikМодераторwww10 авг. 201719:03#235
sti-hi
мой синтезатор гитары работал примерно на пределе производителности, но успевал генерить звук с 6 струн в реалтайме, то есть 44KHz и одновременно его воспроизводить.
MikleМодераторwww10 авг. 201719:09#236
Мои поделки на VB6, что я тут выкладывал, рендерятся в 100-150 раз быстрее, чем звучат, хотя я не ставлю задачу играть реалтайм.
FordPerfectПостоялецwww10 авг. 201719:15#237
sti-hi
>Не знаю, как устроены профессиональные синтезаторы, но как-то они с этим справляются.
Вот например статья про в основном субтрактивный синтез:
http://www.gamedev.ru/community/rt_proc_sound/articles/rt_softsynth_basics

Быстрые примитивы, и функции над ними (фильтры).
Вот пример быстрого синуса (итеративного):
http://www.gamedev.ru/code/forum/?id=202212&page=5#m63

Про Turbo Basic - там отдельный вопрос, что влияет на скорость.

sti-hiПользовательwww10 авг. 201719:48#238
Я взял массив 5000 и заполнил его 1000 раз значениями по алгоритму звуков рояля, тому самому, который мы обсуждали.
Времени на это потребовалось 22 секунды. То есть частота генерации семплов, без записи их в звуковой файл составила около 230 тысяч в секунду, что в 5.15 раз быстрее скорости раздачи 44100 семп/сек.
Казалось бы хорошо, но в реальной программе путь не такой прямой - по дороге проверки делаются, типа - "не хотите ли этот обертон присоединить?", "не желаете ли аккордом звук разнообразить?", "не пора ли звук окончить?".
От каждого музыканта амплитуду нужно донести до дирижёра. Дирижёр амплитуды складывает и записывает в файл.
Вот время и набегает.
Сейчас посмотрю, сколько нужно времени, чтобы из этого массива в файл данные переписать. Тоже, прилично, наверное.
Дм.
sti-hiПользовательwww10 авг. 201719:59#239
Времени потребовалось 67 секунд. То есть семпл записывается в 3 раза медленнее, чем создаётся.
Это моно запись, кстати. Не знаю. как со стерео.
Дм.

Страницы: 1 2 3 4 ... 15 16 17 18 Следующая

/ Форум / Программирование игр / Звук

2001—2017 © GameDev.ru — Разработка игр