Физическое моделирование гитары.

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Физическое моделирование гитары.

Сообщение Хакер » 09.09.2012 (Вс) 12:55

Хех. Я вот сейчас вынужден заниматься чем-то похожим, да только в распоряжении у меня 8-битный процессор с тактовой частотй 20 МГц. Которому не то, что floating-point-числа считать — 16-битные уже в напряг.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Физическое моделирование гитары.

Сообщение Proxy » 09.09.2012 (Вс) 13:33

Попробую ввести вязкость. Позиции точек на синглах, скорости и "массы" тоже, может дело в 176 kbps?

UPD Теперь развалилась запись в 16bit wav, исправной копии не сохранилось. Что-то забыл как single преобразовать в 2 байта wav, нужно инвертировать старший бит у каждого байта (+128 mod 256)?
Последний раз редактировалось Anonymous 09.09.2012 (Вс) 14:12, всего редактировалось 1 раз.
Follow the white rabbit.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Физическое моделирование гитары.

Сообщение Mikle » 09.09.2012 (Вс) 13:50

может дело в 176 kbps?

Естественно, у тебя 11050 гЦ. Задавай 44100, будет хорошо.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Физическое моделирование гитары.

Сообщение Proxy » 09.09.2012 (Вс) 14:39

Что-то я окончательно запутался как писать в wav.
Есть значение амплитуды (пока это просто точка струны), это single, значения от -1 до 1 (у меня иначе, но для простоты пускай будет -1..1)
Как это поместить в 2 байта в формате wav?
Пусть b1 и b2 — это переменные, которые будут записаны в wav (1 семпл), а A - амплитуда.
Как A преобразовать в b1, b2?
Как я делал:
Смещал амплитуду на половину вверх, умножал на 65535, разбивал полученное значение на 2 байта, инвертировал в каждом старший бит
Но почему-то сейчас это не работает.


UPD. Вроде заработало, но всё же сомневаюсь, что верно в 16 бит преобразовал.
И теперь работает ужасно медленно, с увеличением битрейта во много раз увеличилось число итераций (частота в семплах в секунду увеличилась примерно в 4 раза, частота колебаний каждой струны в семпл уменьшилась тоже в 4 раза, длина струны соответственно увеличилась и обсчёт всех её точек теперь занимает довольно большое время, даже выше времени воспроизведения на моём ноуте, т.е. на работу с потоковым midi уже рассчитывать не придётся).
Вложения
sequencer.7z
(9 Кб) Скачиваний: 116
Follow the white rabbit.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Физическое моделирование гитары.

Сообщение Mikle » 09.09.2012 (Вс) 15:26

Proxy писал(а):Есть значение амплитуды (пока это просто точка струны), это single, значения от -1 до 1 (у меня иначе, но для простоты пускай будет -1..1)
Как это поместить в 2 байта в формате wav?

Используй обычный Integer, умножай Single на 32767.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Физическое моделирование гитары.

Сообщение Mikle » 09.09.2012 (Вс) 16:24

Держи пример. Кроме коэффициента вязкости ещё введён коэффициент случайности - массы узлов отличаются от заданной на случайную величину, это придаёт звуку натуральность, для более длинных струн приходится делать бОльшую случайность. Если случайность = 0, то звук ровный, синтезаторный, если слишком много - начинает фальшивить, как ржавая струна на гитаре.
Вложения
String.zip
(10.28 Кб) Скачиваний: 124

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Физическое моделирование гитары.

Сообщение Proxy » 09.09.2012 (Вс) 22:35

Спасибо.
Жаль только медленно это всё работает с 4-6 струнами, хотя я не оптимизировал практически ничего пока, не анализировал на что больше всего времени расходуется.
И вот пока произвольный набор звуков:
Вложения
out.7z
(275.97 Кб) Скачиваний: 129
GA_OYE.7z
(246.9 Кб) Скачиваний: 114
Follow the white rabbit.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Физическое моделирование гитары.

Сообщение Proxy » 10.09.2012 (Пн) 2:26

А как делать следует натягивать струну? В том примере (String.zip) струне придётся строгая форма, все прежние колебания гасятся (а если не сбрасывать скорости, то точки могут выйти за пределы и если искусственно их ограничивать, то выйдет дисторшн).
Я за несколько семплов поднимал одну точку, но так звук получается слишком мягким. Попробовал поднимать не из нулевого положения — звук стал более резким, но появилось эдакое пластиковое клацание. Если поднимать слишком резко, то амплитуда получается низкая.
Follow the white rabbit.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Физическое моделирование гитары.

Сообщение Proxy » 10.09.2012 (Пн) 14:48

Хм, для той партии, которую я хочу испытать, нужен перегруз, но тут снова проблема:
Овердрайв и дисторшн работают с выходным сигналом.
Не понимаю тогда как сводить струны. Я брал средне арифметическое между всеми струнами (и естественно максимальная амплитуда от одной струны зависит от количества струн). Если не делить на их количество, то при резонансе значение амплитуды переполнится. Можно сделать компрессию (коэффициент к амплитуде, постепенно меняющий значение в зависимости от амплитуды, такая обратная связь), но идеологически это как-то криво выходит: между звукоснимателем и примочкой никаких компрессоров нет.
Follow the white rabbit.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Физическое моделирование гитары.

Сообщение Mikle » 10.09.2012 (Пн) 20:12

Proxy писал(а):как сводить струны. Я брал средне арифметическое между всеми струнами (и естественно максимальная амплитуда от одной струны зависит от количества струн). Если не делить на их количество, то при резонансе значение амплитуды переполнится.

Просто суммируй амплитуды, всё делай в Single, тогда не переполнится, и дисторшн тоже в Single.
Proxy писал(а):но идеологически это как-то криво выходит: между звукоснимателем и примочкой никаких компрессоров нет

Кстати, компрессор перед перегрузом ставят довольно часто, чтобы "разогреть" звук. И ещё перед перегрузом режут низкие и высокие частоты. Эквалайзер перед "примочкой" никто не ставит - это встроено в саму "примочку".

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Физическое моделирование гитары.

Сообщение Хакер » 10.09.2012 (Пн) 20:13

Mikle писал(а):Просто суммируй амплитуды, всё делай в Single, тогда не переполнится, и дисторшн тоже в Single.

Потом переполнится, когда будет конвертировать в целочисленный сэймпл для записи в буфер воспроизведения (или куда он там записывает?).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Физическое моделирование гитары.

Сообщение Mikle » 10.09.2012 (Пн) 20:32

Хакер писал(а):Потом переполнится, когда будет конвертировать в целочисленный сэймпл для записи в буфер воспроизведения (или куда он там записывает?).

Ну так в этой одной точке и подобрать коэффициент.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Физическое моделирование гитары.

Сообщение Proxy » 10.09.2012 (Пн) 20:35

Проанализировал и вот что вышло:
Во-первых струну не стоит отдёргивать на 100% возможного, во-вторых просто суммировал значения (а т.к. резонанса нет (когда нет), то и значения на выходе получаются приемлемые при оттягивании струн на 60-70%), но: при записи в целочисленный всё равно помещаю с mod 65536 (и если всё же появится дисторшн там, где его не должно было быть, то очевидно громкость каждой струны нужно убавить). Но оно и в реальности так, потенциометр громкости выхода на гитаре обычно на 100% не ставится, всегда у него остаётся запас хода (остальное компенсируется настройкой усилителя/примочек/трансмиттера и т.п, в любом случае нет идеального универсального уровня громкости). Так вот: всё сводится и звучит достаточно реалистично, так что проблема оказалась и не проблемой вовсе. Работает с чистым входным сигналом, отсекать низкие и высокие не пришлось.
Что ещё: написал овердрайв/дисторшн. Порадовало. Можно отсекаемый гребень направить в произвольном направлении, можно вообще амплитуду гребня умножить на 0 (чистый дисторшн), можно установить уровень чувствительности (в процентах от предельной амплитуды). И это тоже по звучанию меня пока удовлетворяет.
Пока для достижения результата остаётся только "подкручивать" различные параметры. Ну и дальше хочу попробовать на чём-нибудь мелодичном, но конвертер из midi пока делал, а вручную в моём формате писать довольно утомительно, когда нельзя быстро послушать (4 струны 4 такта 120BPM обрабатывает порядка 15-20 секунд на моём ноуте). Была мысль сделать быстрый режим "предпросмотра" с синусоидами, вместо моделирования, но пока не реализовал.
Вложения
out-GA-Guitars+Bass.7z
(779.71 Кб) Скачиваний: 120
Follow the white rabbit.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Физическое моделирование гитары.

Сообщение Хакер » 10.09.2012 (Пн) 22:51

Mikle писал(а):Ну так в этой одной точке и подобрать коэффициент.

Как подобрать?
Не известно же, как и когда сложатся фазы разных нот.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Физическое моделирование гитары.

Сообщение Proxy » 11.09.2012 (Вт) 0:53

Mikle писал(а):Ну так в этой одной точке и подобрать коэффициент.

Не очень понял мысль.
В этой одной точке подобрать коэффициент при присвоении её значения буферу и затем далее его использовать для последующих (и снова уменьшить коэффициент при необходимости сколько угодно раз)? Если да, то это выйдет примитивнейший звуковой компрессор. Если нет, то а) пройти всю партию и подобрать (т.е. подогнать максимальную амплитуду всей партии к определённому значению)? б) просто к одному значению подобрать коэффициент, с которым оно уместится в диапазон? Если а) этот вариант не подходит для потокового режима (ну если уж рассматривать подобную перспективу), да и в целом немного нелеп, как и в варианте с компрессором будет разный уровень сигнала, если секвентировать целую композицию или отдельный её фрагмент, который к примеру намеренно более тихий, не натурально как-то, если б) это равносильно mod 65536, т.е. на выходе будет слышно перегруз (ну оно так и должно работать, слышишь перегруз - значит что-то неправильно настроено).

Но проблемы никакой на самом деле нет.
Если выставить громкость на максимум (и оно настраивается, по крайней мере у меня теперь), то зашкалит и возникнет дисторшн (притом не в какой-то неожиданный момент, а с определённой периодичностью), но управление громкостью сводит проблему на нет. Если возникнет дисторшн, то настройки не верны. В компрессоре никакой необходимости нет при сведении (плавающая громкость не всегда неуместна), в самой партии должно быть учтено подобное. Т.е. вполне очевидно, что при одновременном звучании только одной струны возникнет меньшая амплитуда на выходе, чем при 6 с разницей частот, кратной октаве (что в реальности, что в модели).
Я при сведении делил суммарную амплитуду на число струн, но это оказалось избыточно, можно частное уменьшить раза в полтора. Ну и если сильно постараться, то можно добиться искажения вследствие перегруза на таких настройках, так же как и в реальности можно создать ужасный шум при желании. Совсем без настройки громкости не обойтись, самый удобный вариант. В общем модель адекватная.
Follow the white rabbit.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Физическое моделирование гитары.

Сообщение Proxy » 11.09.2012 (Вт) 0:57

Чуть-чуть ещё флуда
Вложения
GA_OYE_SoftBASS.7z
Чуть более реалистично
(754.12 Кб) Скачиваний: 119
Jingle bells.7z
Не знаю даже :D Jingle bells, Jingle bells...
(1.62 МиБ) Скачиваний: 127
Follow the white rabbit.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Физическое моделирование гитары.

Сообщение Mikle » 11.09.2012 (Вт) 8:55

Если значения не суммировать, а брать среднее арифметическое - это просто изменит коэффициент в 6 раз (для шестиструнки), коэффициент подбирать всё равно нужно, и регулировка громкости - это и есть подбор этого коэффициента.
Компрессора бояться не нужно, практически любая студийная запись, сделанная начиная с 90-х годов, компрессирована не только по отдельным сигналам, но и по общему миксу, просто компрессора должно быть в меру, нужно правильно подобрать время атаки и затухания.
И откуда мысль, что перегруз - это mod 65536? Хорошо, допустим мы используем не Integer, а два младших байта из Long, считая 32768 за 0 на выходе звучки, тогда перегруз будет:
Код: Выделить всё
If v > 65535 Then v = 65535
If v < 0 Then v = 0

Это называется насышение, очень удобно делать на MMX, без всяких If-ов.
Такой перегруз практически не слышен, если "клипует" меньше 1% пиков в сигнале.
Последние записи создают ощущение игры жёстким медиатором (не ногтями) на нейлоне, на одной струне.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Физическое моделирование гитары.

Сообщение Proxy » 11.09.2012 (Вт) 10:27

Mikle писал(а):И откуда мысль, что перегруз - это mod 65536?

Эммм, тут я и вправду не подумал. Но у меня вышло так: есть настройка овердрайва (овердрайв до помещения single в integer; и да, там он работает не с mod 65536, а как раз таки ближе к варианту выше), отвечающая за амплитуду, начиная с которой "гребень" искажается (что-то типа чувствительности), а вышло так, что для его отключения мне оказалось проще просто выставлять чувствительность -0 от максимальной амплитуды, в этом режиме тем не менее он не позволяет величине амплитуды превысить максимальную по абсолютному значению (там ещё речь про -127..127, -128 понятно почему не используется). Ну и в других режимах я высчитывал коэффициент, не позволяющий отправить отражённый или усиленный гребень за пределы -127..127 (второй параметр после этого устанавливает коэффициент к максимально допустимому отбросу значения, входящего в диапазон чувствительности, а не какое-то конкретное значение, т.е. зависит ещё и от первого параметра). Поэтому от этой косячной конструкции удалось избавиться ещё до того, как дошло, что она работать не будет.
Понимаю, что может быть не очень понятно объяснил, как это работает, сейчас попробую для наглядности нарисовать.

И да
Mikle писал(а):If v < 0 Then v = 0

Это не совсем верно.
Код: Выделить всё
If v < 1 Then v = 1
всё же, т.к. в случае с максимальной по абсолютному значению амплитудой 127, значение -128 не используется, т.к. нужна симметричность (т.е. нечётное число значений).
Follow the white rabbit.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Физическое моделирование гитары.

Сообщение Proxy » 11.09.2012 (Вт) 11:46

А вот то, о чём я говорил:

Здесь синим — та часть значений, которая остаётся без изменений, зелёным - граница чувствительности (параметр A), жёлтым — возможные значения после обработки, красным — предельные значения второго параметра (параметр B).
Ситуация 1 — это когда чувствительность ниже 50%, Ситуация 2 — не ниже 50%.

Ну и после этого (на графике уже не показано) вычисляю максимальное значение амплитуда на выходе и вычисляю коэффициент.
Вложения
Овердрайв.png
Овердрайв.png (9 Кб) Просмотров: 7287
Follow the white rabbit.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Физическое моделирование гитары.

Сообщение Proxy » 11.09.2012 (Вт) 11:57

Mikle, нашел ошибку в том примере (String который).
Вот этот фрагмент кода из тика:
Код: Выделить всё
For i = 1 To stLen - 1
    S(i) = S(i) * k1 + (S(i - 1) + S(i + 1)) * k2
  Next i

При проходе по всем скоростям выходит так:
мы берём точку 1, меняем её скорость (актуальная), переходим к точке 2, вычисляем её значение, используя скорости точек 1 (актуальное значение) и 3 (не актуальное значение). Актуальные значения для нового состояния системы использовать нельзя — это вызывает искажения. Нужно накапливать значения в другое место, а потом копировать в S(i), тогда вязкость будет корректней работать.
Follow the white rabbit.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Физическое моделирование гитары.

Сообщение Proxy » 11.09.2012 (Вт) 12:22

Вот тут есть ещё кое-что годное.
Follow the white rabbit.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Физическое моделирование гитары.

Сообщение Mikle » 11.09.2012 (Вт) 13:08

Proxy писал(а):нашел ошибку в том примере (String который).

Согласен, на больших значениях Force это может привести к искажениям, но тот пример - просто демонстрация что за чем вычисляется, я написал его минут за 20 с нуля (modSounds и код формы).
А рэндом ты применяешь? Обратил внимание, как он украшает звук, особенно низкий? Главное - подобрать оптимальное значение.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Физическое моделирование гитары.

Сообщение Proxy » 11.09.2012 (Вт) 13:31

Да, использую, но толку пока придать не смог, у меня оно пока сильно искажает звук, фальшивит при увеличении разброса массы рэндомом. При определении активной длины струны в зависимости от требуемой частоты, видимо где-то неправильно учитываю этот "разброс" значений. Притом фильшивит как-то не пропорционально что ли, даже не знаю как сказать. В общем в реальности если струна недотянута или перетянута и играешь несколько долей чисто на этой струне, то чувствуется равномерное смещение тона (0 и 12 лад не совпадут лишь чуть-чуть от разницы в октаву, а может даже и совпадут, надо бы флажолетом исследовать, дабы не добавлять натяжение при зажатии в ладу; даже при снижении строя на целый тон ничего страшного не происходит). В случае же с моделью добавление разброса массы всё портит, на одной струне при разной длине в зависимости от разброса массы может начаться полный хаос. Или дело в распределении случайной величины, или может быть нужно сглаживать разброс массы соседних точек, или я неправильно вычисляю длину по частоте с учётом разброса — не знаю. Или может эта модель просто не позволит сделать большой разброс. В общем с этим предстоит ещё разобраться.
Follow the white rabbit.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Физическое моделирование гитары.

Сообщение Proxy » 11.09.2012 (Вт) 18:42

Проверка Overdrive. Без постобработки. Пока довольно вяло.
Follow the white rabbit.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Физическое моделирование гитары.

Сообщение Хакер » 11.09.2012 (Вт) 18:52

Mikle, а мне ты так и не ответил.
Как в музыкальных программах и реальных железных синтезаторах смешваются звуки разных одновременно играющих нот?

Я у себя реализовал простым сложением. Для этого пришлось взять амплитуду каждой ноты (правильнее скажем, каждого «голоса») где-то в 2,5 раза меньше максимально возможной амплитуды в системе. Да и то, что нет никакой гарантии, что при таком подходе определённая комбинация голосов не достигнет максимально возможной амплитуды и не вызовет переполнение. Если гитаристы каким-то неведомым образом считают distortion — полезной фишкой, то для меня это однозрачно провал и катастрофа.

Я предполагаю, что в промышленных решениях для синтеза исходные данные по колебаниям представляются в виде комплексных чисел (частота + фаза), и перед смешением происходит какая-то нормализация. Или тоже просто сложение?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Физическое моделирование гитары.

Сообщение Mikle » 11.09.2012 (Вт) 19:06

Звуки струн в звукоснимателе просто суммируются, в микшере, если добавить ещё один источник, громкость остальных от этого меньше не становится. При цифровой обработке звук представлен потоком сэмплов, там просто нет понятия "фаза", нет комплексных величин, они не требуются. Сэмплы точно так же суммируются.
Синтезаторы - случай особый, их устройство может быть совершенно разным, я не знаю всех вариантов, но знаю, что существует среди прочих WaveTable - те же семплы, их воспроизведение с разными частотами, суммирование при сложении с интерполяцией при разных частотах сэмплирования.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Физическое моделирование гитары.

Сообщение Proxy » 11.09.2012 (Вт) 20:21

Mikle писал(а):Сэмплы точно так же суммируются.

но всегда есть возможность настроить громкость...
И всегда можно намеренно всё это дело зашкалить.
Хакер писал(а):Если гитаристы каким-то неведомым образом считают distortion — полезной фишкой, то для меня это однозрачно провал и катастрофа.

Или мотиватор убавить громкость где-нибудь до суммирования.

Попробую иначе сформулировать проблему, которой нет: если сложить и поделить на количество "голосов" (точно-точно, "голосов" :) ), то на выходе будет сигнал с низкой амплитудой. Если его повышать после этого искусственно, то это приведёт к потери качества при цифровом звуке, ибо для 2 голосов амплитуда потеряется почти в 2 раза (т.е. один бит уже потерян как бы), для 4 голосов уже 2 бита бездействуют, когда их пики не совпадают. И само-собой в природе нет никакого универсального коэффициента, позволяющего гарантировать отсутствие переполнения и при этом нормализовать громкость по максимуму. Не обойтись никак без регулятора громкости, которым можно подстроить громкость при недостаточности или переполнении, без компрессора или ещё какого эффекта. В общем-то так оно же и есть везде. Да и не только с цифровыми устройствами, у аналоговой те же проблемы при сведении.
Последний раз редактировалось Anonymous 11.09.2012 (Вт) 20:39, всего редактировалось 1 раз.
Follow the white rabbit.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Физическое моделирование гитары.

Сообщение Хакер » 11.09.2012 (Вт) 20:37

Mikle писал(а):Звуки струн в звукоснимателе просто суммируются,

Гитара мне нафиг не интересна :)

Mikle писал(а): При цифровой обработке звук представлен потоком сэмплов, там просто нет понятия "фаза", нет комплексных величин, они не требуются. Сэмплы точно так же суммируются.

Конечно, я знаю, я как раз делаю простой железный синтезатор.

И сэмплы у меня 16-битные. Соответственно, 0x8000 — это нулевой уровень сигнала. А синус с амплитудой [a] будет иметь минимум 0x8000-a и максимум 0x8000+a.

Если мы одномоменто собираемся воспроизводить только один синусовый войс, то в качестве [a] мы можем взять 32767. Тогда значения сэймплов у нас будут идти по синусоиде с минимумом-единицей и максимумом 65536.

Если мы собираемся воспроизвести два войса, например Ля первой октавы и Ля второй октавы, то безопасно во всех случаях использовать прежнее значение [a] мы не можем. Худший случай, это когда обе ноты ля начали играть синфазно. В этом случае у нас суммируются для синфазных синуса, один с частотой 440 Гц, другой с частотой 880 Гц. Интерференция этих двух волн даст максимумы с частотой 440 Гц. Величина [a] в этом случае должна быть в два раза меньше, чем в предыдущем случае.

С аккордом из трёх нот прежняя величина [a] опять же может вызвать переполнение значения отдельно взятых сэмплов.

В общем, есть у синтезаторов такой параметр как полифония — количество одновременно звучащих «войсов». А «войс» — это, соответственно, воплощение нажатой (сейчас или ранее) ноты.

И вот допустим у нас ADSR-огибающую выкрутили так, что Release-фаза очень велика. И сыграли гамму — все ноты от «До» одной октавы до «До» следующей окатвы. Если сыграли быстро, как только сыграли последнюю ноту, одновременно будет звучать сразу 8 войсов. В этом случае [a] должно быть таким, чтобы сумма
0x8000+a*sin(частота_ноты_до * 2pi*time)+a*sin(часота_ноты_рэ * 2pi*time) ... + a*sin(частота_последней_ноты_из_гаммы) не дала целочисленное переполнение сэймпла.

Вопрос заключается в том, какой параметр [a] выбирать и по какой методике (кроме подбора). Я вот выбрал подбором, и никаких проблем получить с выбранной величиной не могу, что бы я не пытался играть. Простому потому, что разные осцилляторы при их большом количестве не только могут взаимоуничтожать свой вклад.

Но это за счёт того, что значение [a] достаточно мало. В итоге моя софтовая модель моего аппаратного синтезатора звучит тише, чем аналогичный синтезатор из какого-нибудь FL Stuido.

Поэтому я думаю, что FL Studio как минимум, а промышленные железные синтезаторы как максимум, умеют каким-то образом твикать начальную фазу своих синусовых осцилляторов так, чтобы при обеспечении максимально возможного [a] интерференционная картина никогда не вызвала переполнения целочисленных значений сэймпла.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Физическое моделирование гитары.

Сообщение Proxy » 11.09.2012 (Вт) 20:41

Звуки струн в звукоснимателе просто суммируются

Он аналоговый, ему это не грозит снижением качества звука на выходе, ему можно оставить предел вше того, который может возникнуть в некоторых ситуациях. А вот в коде - это проблема же.
Follow the white rabbit.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Физическое моделирование гитары.

Сообщение Proxy » 11.09.2012 (Вт) 20:45

Так ведёт себя овердрайв, если его применить двоекратно. Меня в целом уже радует, но явно ещё пока косячно звучит :) главное всё это могло бы работать в потоковом режиме, если бы производительности достичь приличной, т.е. ничто не зависит от будущих состояний, в т.ч. и овердрайв.
Follow the white rabbit.

Пред.След.

Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList  
cron