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

Человек

Отправить сообщение
Если мы сменим частоту волны, но оставим такой же «относительную фазу» то значения волны совпадут и щелчка не будет.
Щелчок от такого решения никуда не денется, а станет лишь менее слышимым.

Логарифмическая функция на атаку — это ваше личное изобретение? Поскольку её применение также будет приводить к щелчку перед звучанием ноты.

И экспоненциальную форму затухания используют вовсе не из-за особенностей слуха. А потому что она достаточно близко аппроксимирует затухающие колебания струны.
Я правильно понял, что этот синтезатор — монофонический?
Подозреваю, что вся статья писалась ради посткриптума)

Я даже сходил и послушал и скажу честно, был разочарован. Вы же не думали, что ваше творчество понравится абсолютно всем? Да и у слышал совсем не то, что ожидал — живое исполнение вместо электронной музыки, что было логичным ожидать в теме про синтезаторы. Я не хочу никого обижать, но — хорошая музыка не нуждается в саморекламе. Стив Вай не придёт на хабрахабр с предложением заценить его суперзапил в постскриптуме в статье о неважно о чём.

Проблема с VST сейчас в том, что их — чересчур много. Миллиарды авторских синтезаторов с убогим звучанием и ужасным интерфейсом. Триллиарды эффектов с абсолютно одинаковыми дилэями и компрессорами. А знаете почему? Сейчас расскажу.

1. Подмена целевой функции.
Вместо создания шедевра и приятного звучания целью становится — самоутверждение. Лучше плохой звук, зато свой собственный. Отсюда и неприятие любой критики. Написали шедевр, но его не оценили — значит, не шедевр. Написали крутой синт, а его не качают — значит, он крутой только в вашем личном воображении.

2. Подобного рода руководства.
Здесь нет обобщения опыта за несколько десятков лет. Вы разобрались с этим пару за дней (как вам показалось) и почувствовали себя достаточно квалифицированным, чтобы учить этому других. И кому-то может показаться, что сложность написания VST — это сложность прикрутить C# к С++, а сложность написания синтезатора — это сложность соединить осциллятор с огибающей и частотной модуляцией. Вам удалось получить отличный от синусоиды звук — и кажется, что вы уже познали дзен. А на самом деле это ещё даже ещё не таблица умножения.

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

Что же делать?

1. Взрослая теория, а не руководства для школьников.
Например, Вадим Завалишин — The Art of VA Filter Design. А после — теорию DSP (ЦОС) как есть, потом — множество научных работ, только из которых можно почерпнуть самое актуальное.

Например, синтезировать элементарные сигналы (помимо синусоиды), как в этом проекте — нельзя. Почему? Потому что эти алгоритмы создают шум. Почему? Сказывается эффект дискретизации. Как правильно? Например — так.

2. Учиться у классиков.
Настоящие музыканты учатся, играя Баха. Ну или признанных современников. Ненастоящие музыканты учатся на гитарных школах, написанных другими ненастоящими музыкантами, и состоящими исключительно из коротких музыкальных фраз. Из которых, как не напрягайся, музыки не получается.

Так и тут. Здесь классика — это аналоговые синтезаторы. Многие из них перенесены в цифровую форму. Не смогли найти структурную схему? Подберите звук на слух и методом тыка перебора, чтобы звучание совпадало один в один. Также, как и настоящие музыканты в состоянии подобрать музыку на слух, если у них нет нот.

3. Использовать подходящие инструменты.
Самый прогрессивный на текущий момент модульный синтезатор — это NI Reaktor, и все инструменты от NI также строятся на его основе. Там есть (почти) всё. Лучше найти самые первые её версии — 2.3 и Generator (предыдущее название). Там и синты с эффектами попроще, и модели реальных (например, Juno) можно найти. Заодно можно будет отследить и развитие тенденций по синтезу (и обработке в том числе) звука.
VST SDK можно скачать с официального сайта.
В дальнейшем мы будем работать с библиотекой VST.NET, которая является оберткой для VST 2.4.
Если я не ошибаюсь, SDK для VST 2.4 на официальном сайте уже давно недоступна.
1. Хотите послушать — пожалуйста.
2. Все эти сигналы имеют непосредственное отношение к музыке. Чистые тона — основа электронной музыки. Логарифмические свип-тона можно услышать у Jean Michel Jarre в Oxygen II. Также существуют стили музыки (например, Нойз) в которых шуму отводится первоочередное значение.
В руках ребёнка всё — игрушка.
Наконец-то смог откомпилировать проект и сделать несколько измерений. Так как результаты получились довольно объёмные, оформил их в виде отдельной статьи (в песочнице) с некоторыми дополнительными замечаниями.
А может, и наоборот — учёные вдохновились идеями Уэллса и воплотили их в реальность.
Мы вроде бы как нормализуем не число, а его представление. А число каким было, таким и осталось.
1. сумма 0.6000006 и 0.03339874 — формата float недостаточно для вычислений с данной точностью.

Да нет. В большинстве случаев он достаточен. Формат float обеспечивает представление десятичных цифр в двоичном коде, гарантируя 7 верных десятичных цифр.

Вы как бы не учли, что если привести эти числа к одному порядку, получается уже 8 значащих цифр.
А как вы догадались, что округлить надо до 4 цифр? Глядя на полученный результат? А почему не до 5 или 6 знака после запятой, как здесь кто-то выше предлагал?

Можно и до 5 или 6, результат будет тот же. А до 4-х исходя из точности исходных данных, а именно 105.3256.
К сожалению, при попытке компиляции появляются ошибки,
например:
..\..\..\..\ROAD-development\ROADcodec\ROADdecoder\Driver\DataDriver.cpp: In static member function 'static std::unique_ptr<ROADdecoder::Driver::IDataReadDriver> ROADdecoder::Driver::DataDriver::getIDataReadDriver(std::shared_ptr<unsigned char>&, PlatformDependencies::ROADUInt32, Endian::EndianType)':
..\..\..\..\ROAD-development\ROADcodec\ROADdecoder\Driver\DataDriver.cpp:12:90: error: 'std::unique_ptr<Endian::IEndianConvertor>' is an inaccessible base of 'PlatformDependencies::Unique_ptr<Endian::IEndianConvertor>'
std::unique_ptr<IDataReadDriver> result(new DataReadDriver(aData, aLength, lconvertor));
^
..\..\..\..\ROAD-development\ROADcodec\ROADdecoder\Driver\DataDriver.cpp: In static member function 'static std::unique_ptr<ROADdecoder::Driver::IDataReadDriver> ROADdecoder::Driver::DataDriver::getIDataReadDriver(ROADdecoder::Driver::DataContainer*, PlatformDependencies::ROADUInt32, Endian::EndianType)':
..\..\..\..\ROAD-development\ROADcodec\ROADdecoder\Driver\DataDriver.cpp:23:90: error: 'std::unique_ptr<Endian::IEndianConvertor>' is an inaccessible base of 'PlatformDependencies::Unique_ptr<Endian::IEndianConvertor>'
std::unique_ptr<IDataReadDriver> result(new DataReadDriver(aData, aLength, lconvertor));

Я что-то не так делаю?
Почему вы не хотите выложить исполняемый файл(ы)?
В ваших рассуждениях имеются следующие ошибки:

1. сумма 0.6000006 и 0.03339874 — формата float недостаточно для вычислений с данной точностью.
2. умножение 0.06543455 на 139 — аналогично, при умножении необходимо иметь удвоенное количество разрядов для хранения результата.
3. деление 131 на 0.066 аналогично предыдущему. 1/0.066=15.151515...=15.(15) имеет бесконечное количество значащих цифр.
4. вычитание 105.3256 и 105.32 — здесь точности уже достаточно, и для получения корректного результата достаточно округлить результат до 4 цифр после запятой. Округление необходимо для отбрасывания погрешности, внесённой при преобразовании из 10-ого представления числа в двоичное. Продемонстрировать это можно, например, так:

float round(float v, float digits)
{
	float scale=pow(10,digits);
	return floor((v*scale+0.5f))/scale;
}

int _tmain(int argc, _TCHAR* argv[])
{
	cout.precision(7);
	cout << round(105.3256f-105.32f, 4.f) << endl;
	return 0;
}

Вообще, для проверки ваших математических выкладок я бы рекомендовал Вам использовать не Excel или калькулятор, а системы компьютерной алгебры. Например, в Wolfram Mathematica можно явно задавать точность чисел с плавающей точкой для обеспечения корректного результата:

In[1]:= 105.3256`7 - 105.32`7
Out[1]= 0.0056

In[2]:= 131/0.066`7
Out[2]= 1984.848
В ваших статьях я не нашёл строгого математического доказательства этому.
Хотите точные операции с дробями — используйте fixed point арифметику.

Для точных рациональных вычислений нужно использовать специальные средства, например, класс «ratio» в c++, который хранит отдельно числитель и знаменатель в целочисленном виде.
Нет вопросов к социальному статусу автора.
Нет фатальной ошибки в том, что формат с ограниченной точностью имеет ограниченную точность.
Если вы хотите убедить, что в реализации IEEE754 есть ошибки — то надо не сюда писать, а в комитет по стандартизации.
Если вы изобрели новую, улучшенную технологию обработки чисел с плавающей точкой — то её надо срочно патентовать, пока этого не сделал кто-то другой.
Если вы боитесь, что «такой неожиданный результат из придуманных нами, случайно не выскочит при контроле, например, за ядерной установкой», то в любом случае уже поздно что-то менять — в современных процессорах стандарт реализован аппаратно.
Прольёт свет на контекст.
Раз об этом зашла речь, а к чему вы, собственно, близки? Если вы далеки от бухгалтерии, математики и программирования, но при этом испытываете потребность решать фундаментальные ограничения чисел с плавающей точкой.
Если же все, что написано в статье, давно всем известно, то дайте ссылку, где эта проблема освещена

Первая же ссылка в google на запрос «floating point issues»:
What Every Computer Scientist Should Know About Floating-Point Arithmetic

Информация

В рейтинге
2 155-й
Откуда
Россия
Работает в
Зарегистрирован
Активность