-
11.03.2012, 20:12 #11
Re: Синтезатор с чистым строем
Выдаст-то она целое число. Но период колебания не обязан быть целым. Грубо говоря, допустим, мы берём 1200 отсчётов (целое число) и укладываем туда 119 звуковых колебаний (можно было бы и 118,6543 уложить - нецелое число колебаний - но тогда будут проблемы со стыковкой, которая обязана происходить на нулевом уровне - если только специально плавно не уменьшать амплитуду до нуля перед окончанием сигнала). Имеем колебания с периодом 1200/119 отсчётов Просто по расположению отсчётов в периоде колебания и по величинам отсчётов периоды колебания не будут совпадать друг с другом. Но в силу обязательной фильтрации сигнала слышимой разницы это всё равно не даст (если сами отсчёты рассчитаны грамотно, как описано выше, по возможности близко к среднему, а не по мгновенным значениям).
Разница в том, что, если считаешь сигнал на лету, и в т.ч. вычисляешь заново каждый отсчёт, то по вычислительной нагрузке совершенно никакой разницы, равно ли значение фазы нулю или какому-то другому значению, и равен ли период колебаний целому числу отсчётов. В любом случае ты честно вычисляешь каждый отсчёт из заданной начальной фазы, амплитуды, времени/номера отсчёта и выбранной функции для колебаний. От того, что величины отсчётов будут повторяться в точности на каждом периоде колебаний, нисколько не легче, т.к. ты их всё равно честно считаешь по-новой. И вырубить звук даже резко имеешь полное право в любой момент, когда значение отсчёта достаточно близко к нулю, чтобы не вызвать серьёзного щелчка (а ещё лучше - просто плавно, пусть и быстро, задавить синтезируемый звук по амплитуде - благо, нагрузки по вычислению это здесь не прибавит).Во-первых, честно говоря, не вижу разницы между real-time (на лету) и "заранее".
Ваша проблема вокруг целого числа отсчётов возникает именно при необходимости использовать предсинтезированные сэмплы, которые не могут пересчитываться и даже просто масштабироваться по амплитуде для плавного включения-выключения без щелчков. И поэтому обязаны быть на концах выровнены до нулевого уровня. И вот этот нулевой уровень, если мы его назначаем для начала периода колебаний, приводит к необходимости уложить целое число колебаний (и не обязательно единицу, как по Вашему тексту, а просто целое) в целое число отсчётов (потому что нецелое число отсчётов звуковуха выдать действительно не может), чтобы на концах иметь эти самые нули.
Но понимаете, в чём тут подвох: говорить о том, что мы хотим синтезировать меандр, мы могли бы только в том случае, если бы у нас были шансы вывести на аналоговый выход не только наш основной тон (синусоиду), но и какой-то хотя бы минимальный набор гармоник, которые, собственно, сделали бы наш сигнал приблизительно похожим на меандр. Но на частоте F/2, да что там, даже на F/3, например - у нас таких шансов и близко нет. Ближайшая же нечётная гармоника, 3-я, уже составляет частоту соотв. 3/2 F или F, и безусловно срезается выходным фильтром, т.к. всё, что выходит при цифроаналоговом преобразовании на таких частотах, рассматривается только как куча артефактов и мусора. Поэтому мы на таких частотах можем хотеть синтезировать только синусоидуПусть у нас сигнал - меандр.
Какую самую высокую частоту меандра можно получить?
Один сэмпл - типа 10000, второй - минус 10000.
То есть минимальный период - 40 мксек.
Соотвестсвенно, макс. частота - F/2
И если выходной фильтр хороший, то что-то на синусоиду похожее и получится. Если плохой - то будет некий грязный тон на этой самой частоте. Даже если оно будет похоже на меандр, человек этого не услышит: не то что третья, а даже вторая и первая (основной тон) гармоники в данном случае находятся вне области слышимых частот. Впрочем, можно взять частоту дискретизации хоть 8 кГц, тогда у сигнала с частотой 4 кГц и при отсутствии выходного фильтра хотя бы 3-я гармоника 12 кГц попадёт в область слышимых частот (и 5-я 20 кГц - в область слышимых для некоторых людей, в основном только детей и подростков), и разница с синусоидой на слух таки будет. Но это именно если убрать положенный по штату фильтр, обязанный срезать слишком высокие частоты.
И мы опять не можем хотеть на такой частоте никакого меандра! Потому что опять же все гармоники кроме первой (основного тона) будут заведомо срезаны выходным фильтром. Поэтому спокойно берём, например, 5 отсчётов, и кладём на них 2 периода колебаний, получаем искомое.Но, пардон, как можно сгенерировать меандр с периодом
в 2.5 периода дикретизации?!?
Аналогично: кладём на 201 отсчёт 2 периода колебаний. Т.е. если у нас есть возможность использовать не единственный период колебаний, возможная точность приближения к нужной нам частоте улучшается. Чем больше периодов, тем больше улучшается.
Или в 100 с половиной?Вообще-то не хотелось его касаться, но можно хотя бы и через него зайти.Может, вы Фурьёвое преобразование имеете ввиду?
Ну вот, и тут, в том же Фурье, сами же говорите, достаточно именно целого числа периодов, а вовсе не обязательно единицы. Хотя в общем и непонятно, при чём тут Фурье, но и синтез по гармоникам, разумеется, возможен таким образом, как частный случай для периодических функций вообще, если целое число периодов ляжет на целое число отсчётов. А если у нас есть возможность аккуратно задавить в ноль начало и конец звука, то даже число периодов не обязано быть целым для любых практических целей, в т.ч. для музыки.Так оно само по себе в дискретном виде неточно.
Скажем, если синус раскладывать, то одна гармоника
получится тогда и только тогда, когда будет взято целое
число периодов этого синуса.
Re: Синтезатор с чистым строем
А воообще, то, что описано по ссылке, это по сути основано на "У-тональности" (U-tonality), т.е. выбор тонов из набора "унтертонов" некоего (не обязательно реально существующего) базового производящего тона. Оно же на некоторых сайтах микротоналистов или любителей альтернативных настроек называется "равномерное деление струны". Т.е. это принцип, в некотором смысле обратный используемому при построении натуральной (О-тональной, т.е. основанной на обертонах) гаммы. При этом оказывается, что минорное трезвучие, например, является фактически У-тональным эквивалентом мажорного трезвучия, относящегося к О-тональному "миру".
У меня есть некоторые предположения о том, что У-тональные гаммы в принципе кое-где генерируются в природе (ну, точнее, не то чтобы прямо в природе, но не по специальному на то устремлению музыканта или создателя муз. инструмента) - а именно, я предполагаю, что именно по какой-то У-тональной гамме, возможно, расположены звуки, издаваемые "поющими поездами" на свежеотшлифованных рельсах.
- Регистрация
- 22.01.2012
- Сообщений
- 37
Re: Синтезатор с чистым строем
Если я один период не могу точно задать, то я и два не могу задать )
Как мы будем укладывать период в 100.5 отсчётов на 201 отсчёт?
Полупериод у нас будет 50 с четвертью, этого мы сделать не можем.
На 201-ом отсчёте нам надо уложить 2 периода.
Полупериоды у нас есть целое число периодов дискретизации
и никак иначе.
Пусть первый полупериод будет 50 тактов,
второй ну пусть тоже 50. Пусть третий опять 50.
Тогда 4-ый будет длится 51 период дискретизации.
И получится у вас не 2 периода меандра с периодом 100.5,
а два периода ДВУХ РАЗНЫХ меандров, склейка из двух меандров (по разику)
с разными частотами. Так что моя пока не согласная. ))
- Регистрация
- 22.01.2012
- Сообщений
- 37
Re: Синтезатор с чистым строем
Вот-вот-вот. Тогда и о периоде (строгом повторении во времени) речи быть не может.
Тем-то и хорош чистый строй, что на компе он делается математически точно
(с заранее известными исключениями). Вы глядели же в сорцы, там для периода тоники
выбрано 720 (соответствует 66.(6)Hz при 48kHz). Ну так если мы возьмем для соль 720*(2/3),
мы получим опять же целый период звука в 480 периодов дискретизации.
И этот период будет соблюдаться
с точностью до глюков кварца, которым звучка тактируется,
то есть практически мы поимеем акустически чистую квинту.
И это (чистота строя) вообще никак не зависит от формы сигнала.
В проге у меня не синус и не меандр, но это по совсем другим
соображениям - для многих комбинаций нот наимененьшее общее
кратное получается столь большим, что аккорд может звучать
по 30 сек и то и похлеще.
Впрочем, голый синус звучит уж совсем тускло,
а меандр - слишком жестоко для ушей.
Плюс проблемы производительности - долгий аккорд он и генерируется
дольше, поэтому можем поиметь underrun - ALSA уже готова принять
от нас следующую порцию звука, а мы всё еще копошимся с расчетами.
Поэтому эти долгие аккорды я генерю относительно небольшими кусками.
Но тут мы напарываемся на другую проблему - щелчки.
Они возникают или не возникают в зависимости от того,
в какой момент были отжаты кнопки - если попали на момент,
когда уровень сигнала был высокий, он обрывается, потом начинается
с нуля - вот и щелчок.
Поэтому у меня большая часть периода - вообще 0)
Но до конца от шелчков избавится всё равно не получилось.
Такая вот печаль )
Re: Синтезатор с чистым строем
Вот я всё не понимаю, для чего такая точность-то? Час от часу не легче, теперь уже не только период, но полупериод зачем-то стало надо, чтобы был целым числом отсчётов. И поэтому вы зачем-то предлагаете делать полупериоды разной длины. Если синтезатор предназначен для людей (а не летучих мышей или просто мышей, которые слышат в несколько раз более высокие частоты, чем люди), то даже в вашем экстремальном случае меандра никто не услышит разницы между случаем, когда +1 сменяется на -1 прямо в соседнем отсчёте, и когда он сменяется через один отсчёт (через нулевой, например - тогда можно считать положение границы смещённым ровно на половину отсчёта, или какой-то ненулевой - тогда это м.б. смещение границы на четверть отсчёта или ещё на сколько-то). Например, при выводе изображений на экран представляете себе, что такое антиалиасинг, что такое оверсемплинг? Какой смысл выравнивать, например, величину какого-то изображения по пикселам, если или пикселы столь малы, или пользователь отошёл от экрана (или намеренно аппаратно размыл изображение) так, что в принципе не видит отдельных пикселов? На наших современных мониторах, правда, до этого ещё далеко (если смотреть на него с более-менее общепринятого расстояния), но вот если бы пиксел был величиной не 0,25 мм, а, скажем, 2,5..3 раза меньше - 0,08..0,1 мм - то отдельные пикселы реально были бы не видны. Вот со звуком при современных частотах дискретизации (48 кГц, или даже старый стандарт 44,1 кГц) это уже так.
А поскольку при изображении какого-либо более-менее практически осмысленного звука (в частности, который могут осилить обычные динамики) смена полярности сигнала в пределах 1-2 отсчётов и подавно не нужна, то даже этой теоретически заметной (только на спец.динамиках, и только для летучей мыши, и, возможно, при внесении специальных изменений в выходной фильтр) разницы между прохождением границы периода (или полупериода) не будет. Если же рассчитывать на работу с летучими мышами, то тут опять же не надо изобретать что-то особенное, а просто использовать бОльшие частоты дискретизации и звуковую карту с соответствующим фильтром, который не будет резать нужные нам (или, точнее, мышам) частоты.
По всем этим причинам, я не вижу вообще никаких проблем сделать хоть период, хоть полупериод длиной хоть 100,5, хоть 50,25, хоть сколько угодно отсчётов (точность тут ограничивается сочетанием частоты дискретизации и плотности ступеней оцифровки по амплитуде (напр., практическое число бит в отсчёте), но это ограничение, опять же намного превосходит любые практические надобности).
- Регистрация
- 22.01.2012
- Сообщений
- 37
Re: Синтезатор с чистым строем
Дело не в том, что "надо", а в том, что по-другому
при цифровом синтезе просто не получается.
Да это не я предлагаю, я просто подробно расписал,
что получится, если попытаться уложить два колебания
с реальным периодом в 100.5 тактов дискретизации
на 201 этих тактов.
Ну вы просто представьте (ну или не представьте,
а сделайте), что вы заполняете массив цифирками.
Всего у вас в массиве 201 элемент.
Пусть верхняя полка меандра - это +1, а нижняя - -1.
Какие отсчеты вы сделаете равными +1, а какие равными -1?
Тут как ни крути, получится что-то вроде того, что,
первые 50 отсчетов будут +1, потом 50 -1, потом еще 50 снова
+1 и оставшиеся 51 -1.
Ну не делится 201 на 4 нацело, не делится!
Что мы имеем в итоге?
Вместо 2 колебаний с периодом в 100.5 тактов
мы имеем одно колебание (1 его период) с периодом
100 тактов и второе - с периодом 101.
Но никак не два по 100.5!!!
Иными словами, невозможно сгенерить меандр с периодом,
равным нецелому числу тактов дискретизации.
Вместо этого у вас получится чередование колебаний
по 100 и по 101-му такту.
Я не веду речи про то, что там будет после ЦАПы,
фильтров, усилителей и т.д. Это уже совсем другая
история. Я также ничего не говорю про то, что мы будем
слышать. Я всего лишь говорю, что на этапе "рисования"
звука (то есть заполнения массива отсчетов циферками)
ну просто никак не сделать так, чтобы ... гхы,
запополамить один отсчет ). Ну цифра же! Время - дискретно,
его "квант" - период дискретизации. Не можно сделать так,
чтобы пол-периода дискретизации было одно значение уровня сигнала,
а другие пол-периода - другое.
Насчёт точности.
Еще раз - комп позволяет идеально (с точностью до стабильности работы кварца)
сделать то, что называется "чистым строем".
Если же брать темперированные строи, сделать их на компе
идеально точно не получится, поскольку отношения частот
в таких строях - иррациональные, а у нас тут, понимаешь,
период никак не может быть нецелым.
Разумеется, идеальная точность на практике не особа и нужна,
я не спорю.
Но для чистого строя-то это возможно!!!
Так почему бы и нет?...
Ого. Даже вот как. На четверть периода дискретизации...
Ну вот как вы будете укладывать наши 2 меандрических
колебания с реальным периодом в 100.5 тактов в 201 этих тактов,
чтобы "сместить" чего-то там на "четверть отсчёта"?!?!?
Покажите массив, заполненный цифирками?... Тут неважно, сколько
вы периодов меандра возьмете. У Вас на первом же,
НА ПЕРВОМ ЖЕ периоде получится не 100.5, а 100, 99 или 101 ,)
Так ведь?..
Про "экстремальный" случай меандра.
Ну, во-первых, ничего экстремального в этом нету,
в любом triple oscillator оно есть
Я взял для примера меандр только потому,
что на нём сразу видно, что период может
быть только k*T, где k - натуральное число,
T - период дискретизации.
С другими формами сигналов - ровно та же история,
просто, например, для синуса это какбы не бросается в глаза,
надо на каждый отсчетик в отдельности посмотреть, чтобы
увидеть, что период то у нас получился вовсе и не такой,
какой задумывали.
Окей.
С Вас массив размеров в 201 отсчет, заполненный +1 и -1 так,
чтобы получилось два колебания меандра, причем оба длительностью
ровнехонько в 100.5 ячеек массива ,)
Re: Синтезатор с чистым строем
Это лично у вас не получается, а так, вообще, у всех получается, с той точностью, которую человек вообще в состоянии воспринять. Я не понимаю, зачем нужно идти на такие жертвы, вполне заметные на слух, вплоть до почти что единственной строго фиксированной высоты, от которой можно построить желаемый строй, или каких-то бешеных (не регулируемых исполнителем, фактически) продолжительностей звучания аккордов, ради каких-то сугубо формальных вещей, которые никто на слух не почувствует. Ну не пересчитывает никто на слух отсчёты в периоде колебаний динамика, понимаете...Да вроде у нас ажно 65535 возможных значений (если пунктуально брать только имеющие симметричные относительно нуля, т.е. не считать -3276
С Вас массив размеров в 201 отсчет, заполненный +1 и -1 так,
чтобы получилось два колебания меандра, причем оба длительностью
ровнехонько в 100.5 ячеек массива ,). Зачем ограничивать себя при этом только двумя числами? Даже, как минимум, между +1 и -1 есть ноль, если на то пошло.
- Регистрация
- 22.01.2012
- Сообщений
- 37
Re: Синтезатор с чистым строем
Вы программульку-то попробовали, кстати?
Вот возьмите, замените в ней период тоники
с 720 на, скажем, 727. И вы очень даже услышите,
что весь строй разъехался.
Господи, о каких "жертвах" вы говорите?
Я всего-то хотел написать прожку,
которая будет играть в чистом строе.
Чтобы ежели квинта - так чтобы 3/2 и никак иначе!
Ежели кварта - вынь да положь 4/3 и никак иначе!
Ежели б.терция - чтоб 5/4 и никак иначе!
И вот такой строй на компе-то как раз можно сделать
абсолютно точно! Так почему бы не сделать?
Но самый низкий тон тут не может быть произвольным.
720 тактов дискретизации - наиболее оптимальный выбор.
Вы поменяйте, поменяйте в проге-то...
Или вы хотите устроить дискашшн на тему
"Just Intonation vs. Equal Temperament"?
Ну уж нет, увольте!Преимущества и того, и другого всем,
кто интересовался, уже лет как 200 известны.
12TET уже изъежжен вдоль и поперек, тут больше нечего
делать. А дальше-то что? Будем продолжать тесниться
в 12-ти полутонах в октаве? Искать более хорошие
приближения терций, используя не 12, а 53 нотки в октаве?
Тогда 53TET сразу заполучает жуткий недостаток,
за который ругают чистый строй - а именно, слишком
дофигища кнопочек в октаве. Так раз так, то почему
бы не вернуться к чистому строю? Кнопок в октаве опять
же много, но зато не надо изголяться над терциями и т.п.
Они по определению будут такими как надо.
На этом диспут на тему "Just Intonation vs. Equal Temperament"
закончен.
Вы, наверное, не совсем меня поняли.
Так было в одной из самых ранних версий программы,
щас в этом плане всё в порядке. Да Вы попробуйте наконец же!
Разумеется.
Зато все очень хорошо слышат биения, например...
Так я жеж про меандр толкую жеж!
Как с меандром разберемся, пойдём дальше,
пилой, например, займёмся.
Про обыкновенный простой тривиальный меандр.
Под +1 и -1 имел ввиду значения сигнала
на верхней и ниэней полках меандра, соответственно.
Не нравится плюс-минус 1? Ок, ок, давайте возьмем
плюс-минус 16384.
Итак, повторяю, чего мне от Вас хочется.
Покажите мне 201 (двести один) отсчёт, в которые уложены
2 прямоугольных колебания периодом 100.5 тактов дискретизации
Какие именно из этих 201-го отсчёта будут равны 16384,
а какие - -16384?
Если взять бумажку в клеточку (одна клеточка = период дискретизации)
и нарисовать эти 2 колебания на 201-ой клеточке, то вы всё сразу
увидите! Но только специально напоминаю - короче одной клеточки
какое-то значение сигнала длится не может. Так ведь, да?
Ну вот когда вы всё это нарисуете, то сразу же и увидите,
что первые 50 отсчетов у вас будут 16384, затем 50 отсчетов
по -16384, затем опять 50 по 16384 и наконец, оставшиеся 51
снова -16384.
Если на эту картинку пристально посмотреть, то опять же
можно легко увидеть, что у получилось у нас не два колебания
(прямоугольных) с периодом 100.5 тактов дискретизации,
а одно с периодом 100 и второе - с периодом 101.
Ы?
Из чего явственно следует, что состряпать меандр с периодом
100.5 тактов дискретизации - невозможно. Просто тупо в силу
того, что имеется некий минмальный промежуток времени,
в течение которого сигнал на выходе ЦАПы - постоянный.
А Вы упорно утверждаете, что возможно.
Ну так покажите мне наконец-то уже отсчёты в количестве 201-го,
в которые Вы уложили 2 периода прямоугольного колебания
такого, что его "реальный" период - 100.5 тактов дискретизации.
Уже третий раз ведь прошу...
- Регистрация
- 22.01.2012
- Сообщений
- 37
Re: Синтезатор с чистым строем
Кстати, насчет чего там ухо различает или не различает.
Не поленился сделать 2 файлика.
1
Меандр с периодом 100 тактов звучки (50/50)
2
Чередование меандров по 100 (50/50) тактов и по 101-му (50/51)
Разница на слух есть.
Re: Синтезатор с чистым строем
Ещё нет - пока только читаю сорцы, чтобы понять, что там и как. И офигеваю... То есть, с точки зрения чисто технической - всё вроде нормально. Т.е. программа (по крайней мере у вас на компьютере) работает, звук синтезирует и выводит на нужной частоте - это хорошо. Но вот способ, которым этот звук синтезируется - это просто атас. Причём там есть странные вещи, даже если исходить из вашего постулата о необходимости точной периодичности с точностью до конкретных отсчётов и цифр у каждого индивидуального сигнала. Но про эти моменты - немножко позже.
Ну, с вашей целочисленной арифметикой - конечно, разъедется. Вы же фактически аппроксимируете любую ноту унтертонами частоты дискретизации. Не то чтобы этот подход был чем-то принципиально плох - но для его использования надо не на компьютере это делать, а строить аналоговый синтезатор или даже электромеханический орган. Собственно, они (электромеханические органы), НЯП, примерно таким образом и строились. Ну или если бы была возможность с удобством произвольно перестраивать частоту дискретизации на звуковой карте. Но ведь такой возможности нет, поэтому такая манера работы с цифровым звуком является нештатной. Потому как звуковые карты создавались для работы со звуком любых частот в пределах оговоренного спектра, и всё в ней (в аппаратной части, в том числе) рассчитано именно на это.Вот возьмите, замените в ней период тоники
с 720 на, скажем, 727. И вы очень даже услышите,
что весь строй разъехался.
И опять вопрос: зачем вам именно абсолютно точно? Чем не устраивает результат, который на слух никак не будет отличим от абсолютно точного (но при этом может быть настроен на любой тон, а не только от 720 отсчётов)?И вот такой строй на компе-то как раз можно сделать
абсолютно точно! Так почему бы не сделать?
А почему бы целочисленный период не поменять на нецелочисленный? Разумеется, не просто так поменять тип переменной, а соответствующим образом переделав всю схему синтеза звука.Но самый низкий тон тут не может быть произвольным.
720 тактов дискретизации - наиболее оптимальный выбор.
Вы поменяйте, поменяйте в проге-то...
Вот уж чего мне совершенно неинтересно делать - так это на такую тему ругаться. Тем более, что, чтобы начать ругаться, мне пришлось бы долго чесать репу, и придумывать, какую бы из сторон тут занять. Меня вообще-то интересуют разные строи, хотя бы просто с точки зрения побаловаться. Чистый - в том числе. И непосредственно унтертоновый как таковой - тоже интересует (отдельные ступени которого (точно подходящие по соотношению частот) вы фактически используете для построения чистого страя). Но вот делать принципиально неперестраиваемый софтовый синтезатор под чистый или под унтертоновый строй - это уже какая-то жесть. Но я бы это (целочисленность и неперестраиваемость) ещё понял, если бы там действительно были предвычисленные (один раз, при запуске программы) периоды, которые бы просто включались/выключались (прибавлялись к общему звуку или игнорировались) по клавишам. Тогда да, целочисленность нужна, т.к. просто так сложить по значениям можно только выровненные по времени отсчёты. Но у вас же при каждом новом сочетании звуков (ноте или аккорде) всё это вычисляется заново. Непонятно, зачем - можно же было бы действительно заранее вычислить все ноты по-отдельности, и во время игры уже только складывать их. Сложить N готовых целых чисел (по числу нот в текущем аккорде) как бы побыстрее будет, чем N же раз вычислять 5000*(exp(-(x*x)/period)) (т.е., на минутку, 2 умножения, 1 деление и одна экспонента, пусть она даже при компиляции и не становится настоящим вызовом функции, а "выписывается" прямо на месте в машинном коде - всё равно эта экспонента - дело довольно тяжёлое вычислительно), а потом всё равно ещё преобразование плавающего в целое, и, наконец, сложение. Вот вы сколько лишней вычислительной работы делаете по каждому нажатию клавиши. Если бы вы её не делали, а всё предвычисляли - я бы ещё понял, повторюсь, целочисленные ограничения. Но при таком раскладе, когда по каждому нажатию столько раз пересчитывается всё заново, можно было бы уже расслабиться, и честно вычислять вообще каждый отсчёт (без повторного использования буфера, то есть). Всё равно же вычислительные затраты вас, как видно, не сильно беспокоят
Или вы хотите устроить дискашшн на тему
"Just Intonation vs. Equal Temperament"?
А выдавать сигнал с постоянной составляющей (не просто с постоянной, а вообще все ненулевые отсчёты одного знака) - это как вообще, нормально так? По-моему, это, мягко говоря, совсем не здорово. И если так делать, то оно и неудивительно, что будут щелчки. Постоянное напряжение, наряду с просто очень низкими частотами, конечно, фильтруется звуковой картой, но низкочастотный "щелчок" (тут уж лучше сказать "толчок", наверное, в силу низкой частоты) - как раз в районе частоты среза этого фильтра - вам обеспечен как при начале, так и при конце звучания любой ноты, даже если она состыковалась с тишиной по нулю, т.е. без высокочастотного щелчка.Вы, наверное, не совсем меня поняли.
Так было в одной из самых ранних версий программы,
щас в этом плане всё в порядке. Да Вы попробуйте наконец же!![]()
Так что пробовать я буду, пожалуй, только когда придумаю, как разрулить хотя бы вот этот момент с постоянной составляющей, как минимум.
Боитесь, вам точности типа double, например, не хватит, чтобы никто не услышал биений, что обязательно нужно рациональную дробь из настоящих целых чисел (в виде реальных физических отсчётов на звуковой карте) сооружать? Я уверен, что такие опасения напрасны, причём с очень-очень большим запасом.Разумеется.
Зато все очень хорошо слышат биения, например...
Я ещё раз повторю: звуковые карты создавались для работы с произвольным звуком путём приближения, а не для асбстрактных меандров и т.п. И там стоит выходной фильтр, который вам уже в аналоговой выходной линии (намеренно!!! специально для этого и стоит!) переход от 16384 к -16384 размажет на время, соответствующее этак почти что паре отсчётов. Поэтому ограничиваться этими двумя числами совершенно неинтересно и физически бессмысленно. Вы можете совершенно спокойно использовать кусочек, например, вида ( 16384, 0, -16384), или ( 16384, 6492, -16384), или с любым другим числом в промежутке между. Это есть, с точки зрения конструкции звуковой карты, штатный способ приближения для меандра, у которого теоретический момент перехода не попадает точно между отсчётами. Первая картинка, с нулём - это случай, когда теоретический переход попал точно посередине соостветствующего отсчёта. Второй вариант - это когда не посередине, а где-то в стороне. В частности, для того случая, который вы приводите для примера, полупериод занимает 50.25 отсчётов. Если мы изначально начнём полупериод выровненным по началу первого отсчёта, то будем иметь 50 отсчётов значением +16384, потом отсчёт, у которого 1/4 приходится на значение +16384, а 3/4 - на -16384. Нехитрой арифметикой получаем из этого, что значение этого, 51-го, отсчёта, будет равно -8192 (в данном случае даже не пришлось округлять до целого, ну а в произвольном случае было бы округление - т.е. ошибка плюс-минус 1/2 "ступеньки" при скачке на 32768 в данном случае - т.е. сущая чешуя). Следующий полупериод такой же длины - 50.25 отсчётов. Из которых 0.75 отсчёта у нас уже есть, поэтому мы делаем 49 отсчётов с уровнем -16384, а дальше идёт отсчёт, делящийся ровно пополам между плюсом и минусом, и потому имеющий значение 0. Дальше всё происходит симметрично: ещё 49 отсчётов с уровнем +16384, потом 1 отсчёт с уровнем +8192, потом 50 отсчётов с уровнем -16384. И дальше пошёл новый (целочисленный, в данном случае) период, начинаясь ровно с +16384. Итак, считаем отсчёты: 50+1+49+1+49+1+50=201. Два периода в 201 отсчёт уложены, причём и оба периода равны друг другу, и все полупериоды тоже равны друг другу. Да, наверное, с вашей точки зрения это не есть меандр, потому что использованы 3 каких-то "левых" промежуточных значения. С практической же точки зрения, после того, как фильтр отутюжит все "правильные" переходы, вместе с "неправильными", какой-то заметной разницы между "правильными" и "неправильными" не останется. На месте "правильного" будет, допустим (если взять аналоговый сигнал и попробовать оцифровать обратно), что-то вроде 16000, 12000, -12000, -16000. А на месте "неправильного" (того, который посередине) - что-то вроде 16000, 15000, 0, -15000, -16000. А никакой чёткой ступеньки уже не будет всё равно, как ни старайся - так что напрягаться на эту тему просто нет практического смысла.Итак, повторяю, чего мне от Вас хочется.
Покажите мне 201 (двести один) отсчёт, в которые уложены
2 прямоугольных колебания периодом 100.5 тактов дискретизации
Какие именно из этих 201-го отсчёта будут равны 16384,
а какие - -16384?
Ну вот вы видели, как я делил один отсчёт между разными полками меандра - хоть поровну, хоть по четверинкам, хоть как придётся. Типичный АЦП, скажем, получив на вход сигнал, фронт которого не попал точно между отсчётам, поступил бы в точности так же. И если мы имеем право записывать звуки или иные аналоговые сигналы из реального мира при помощи таких АЦП, то и при синтезе искуственного сигнала совершенно естественно эмулировать поведение того же АЦП. Я просто не вижу практической проблемы на этом месте. Именно для этого частоты дискретизации звуковых карт (или каких-нибудь сигнальных процессоров) и повышают - чтобы превысить "разрешающую способность (по времени)" уха человека, и спокойно антиалиасить и размазывать (в т.ч. аппаратно) любые скачки, а вовсе не для того, чтобы у кого-то волшебный период в 720 отсчётов в области инфразвуков не оказывалсяНо только специально напоминаю - короче одной клеточки
какое-то значение сигнала длится не может. Так ведь, да?![]()
Похожие темы
-
Москва синтезатор
от Mikle в разделе Покупка и продажа инструментов и аксессуаровОтветов: 1Последнее сообщение: 31.10.2008, 00:05 -
Как работать над звуком, чтобы он был чистым?
от Violin-zimmerman в разделе Скрипичная и альтовая музыкаОтветов: 16Последнее сообщение: 24.08.2008, 10:12 -
Синтезатор
от Викуля в разделе ИнструментарийОтветов: 7Последнее сообщение: 13.02.2007, 21:20 -
Синтезатор
от TANIA в разделе ИнструментарийОтветов: 15Последнее сообщение: 05.09.2006, 20:01




Ответить с цитированием
Социальные закладки