Я по образованию и роду занятий не музыкант,
но немного увлекаюсь теорией музыки
и это увлечение в итоге привело к тому,
что я написал программульку, синтезатор с чистым строем.
Думаю, мне будет очень интересно почитать исходники. Возможно, это почти то самое, что я давно ищу. Потому как я как раз пробовал найти хотя бы онлайновые синтезаторы для некоторых строев, однако ничего хорошего не нашёл. Возможно, если повезёт, удастся переделать этот синтезатор для работы в каких-нибудь персидских ладах. Или просто в 53-РДО, или ещё какие-нибудь РДО, чтобы просто поиграться и посравнивать их на слух между собой. В своё время, лет уже 10 назад (ой, блин, неужели это уже целых 10 лет прошло...) я начинал было писать игрульки, издающие (и даже записывающие) какие-то звуки, и даже, хе-хе, показывал и рассказывал одному цивильному товарищу, как это делается (в качестве источника хватило хороших комментариев в заголовках от OSS, кажется), но... это было во времена ещё OSS'ного интерфейса звукового устройства, а очень вскоре он стал как-то неактуален, сменившись на ALSA, и всё на этом застопорилось. В то время как попытки понять, как то же самое делать в ALSA, кончились ничем, т.к. такого же понятного руководства, как в заголовках OSS, я что-то не нашёл среди аналогичных заголовков. А потом на несколько лет (примерно до 2009) вообще вышел из рядов пользователей Линукс. Может быть, почитав Ваши исходники, мне, наконец, удастся что-то понять Да ещё тут программа с нитями - в своих тогдашних почти-школьных программах я до нитей не доходил, всё делал последовательно в единственной. Короче, надеюсь, такая сравнительно небольшая программа, которую и части которой, в отличие от больших, можно обозреть взглядом одного человека - почти самое то что надо, чтобы посмотреть, как более-менее цивильно делается то, что я хотел и пытался сделать нецивильно тогда. В общем, большое спасибо: уже из того, что я успел прочитать в исходниках за первые 10-15 минут, я почерпнул много интересного и полезного для себя, при своём самом начальном уровне. Уже давненько я ничего на C не писал вообще - наверное, как раз те самые лет 10 после тех первых попыток, т.к. по работе-то всё перл да перл обычно...
Он мне больше нравится,
но, к сожалению, он не работает с Pulse Audio
из-за причудливых архитектурных взаимотоношений
этой ALSA с Pulse Audio.
Сообщение от Toman
В общем, большое спасибо: уже из того, что я успел прочитать в исходниках за первые 10-15 минут, я почерпнул много интересного и полезного для себя, при своём самом начальном уровне.
Ок, жду замечаний и всё такое.
Большая проблема - тембр.
Я его "делал" тупо перебирая различные формы сигнала.
Сейчас там используется гауссиана (на первом полупериоде колебания),
второй оставлен нулём. Звучит относительно сносно, но глуховато.
Имеется ввиду, что при генерации звука при помощи звуковой карты
нельзя сгенерировать, к примеру, пилу/менандр/etc с каким
угодно периодом (и, соответственно, с какой угодно частотой).
Период всегда будет кратен 1/F, где F - частота, на которой работает звучка.
Считать это проблемой или нет - это другой вопрос.
Если JI - то это как раз не проблема. )
А если темперации - тогда да, какбы проблема,
поскольку не получится абсолютно точно выдержать
интервалы. Хотя.. по мне это тем более не проблема )
Период всегда будет кратен 1/F, где F - частота, на которой работает звучка.
Это только если задаться целью уложить период сигнала обязательно в целое число отсчётов. Да, может быть, так оно проще, и занимает меньше всего памяти для хранения пресинтезированного образца, насколько это возможно. И требует минимум процессорного времени на вычисление отсчётов в этих пресинтезирванных образцах. Но с другой стороны, когда речь идёт о таких частотах, где на период звука приходится десяток-другой отсчётов, а то и меньше - в общем-то не проблема пресинтезировать не один период такого звука, а достаточно много. Если мы для каждой ноты (считая, что каждая нота синтезируется отдельным генератором) будем синтезировать, скажем, столько периодов, сколько укладывается в 1 секунду, то мы можем в области сколь угодно высоких частот (вплоть до принципиального предела по частоте дискретизации) синтезировать частоты с шагом по крайней мере 1 Гц. А при желании - и с большей точностью, если синтезируемый период не делать равным точно 1 с, а немножко укорачивать или удлинять согласно нашим потребностям.
И вообще, всё это относится только к работе с пресинтезированным звуком. На лету же синтезировать можно звук вообще любой частоты - с такой точностью, какую позволяют сами вычисления на компьютере.
Разумеется, на высоких частотах при таком синтезе значения отсчётов будут как-то меняться с каждым периодом звука (а повторяться только с каждым синтезируемым периодом). Поэтому частоты вроде F/2 на самом деле очень проблематичны: из-за наличия всего лишь 2 отсчётов в периоде мы не можем двигать её по фазе, т.к. при этом будет фактически падать вплоть до нуля амплитуда. А значит, будут возникать сильные биения. Более-менее сносно работает синтез с нецелым числом отсчётов на период при числе отсчётов на период ближе к 3 (пусть даже немножко меньше) и более - это довольно близко аналогично той причине, по которой трёхфазные (или с бОльшим числом фаз) асинхронные электродвигатели лучше однофазных (которые даже не могут без посторонней помощи пуститься в определённую нужную сторону). Поэтому, собственно, реальная "рабочая" часть частотного диапазона ЦАПей и АЦПей должна довольно сильно не дотягиваться до F/2. Более-менее реалистичная оценка - это F/3 с небольшим. Ну т.е. для частоты дискретизации 48 кГц можно более-менее дотягиваться где-то до 16-18 кГц, а выше лезть уже не стоит. При этом необходимо при синтезе звука с высокими частотами (а значит, малым числом отсчётов на период) подразумевать, что значения отсчётов не должны быть мгновенными значениями используемой функции в данной точке, а должны быть средними за весь тот кусок функции, который они "представляют". Если это дело нарушить, то в самом деле будем иметь артефакты в виде биений с частотой f-F/n. А при точных значениях f=F/n, хотя и не будет биений, но тембр звука будет тем или иным образом искажаться, отклоняясь от запланированного.
Это только если задаться целью уложить период сигнала обязательно в целое число отсчётов.
эээ... а как звучка может выдать _нецелое_ число отсчетов?....
Сообщение от Toman
И вообще, всё это относится только к работе с пресинтезированным звуком. На лету же синтезировать можно звук вообще любой частоты - с такой точностью, какую позволяют сами вычисления на компьютере.
Во-первых, честно говоря, не вижу разницы между real-time (на лету) и "заранее".
Во-вторых, не понимаю, как можно сгенерировать *дискретный по времени* сигнал любой частоты.
Давайте на тупом примере. Пусть у нас сигнал - меандр.
И пусть звучка работает на 48 кгц, то есть длительность одного сэмла
примерно 20 мксек (чуть больше, не важно).
Какую самую высокую частоту меандра можно получить?
Один сэмпл - типа 10000, второй - минус 10000.
То есть минимальный период - 40 мксек.
Соотвестсвенно, макс. частота - F/2
Следующий период - 3*20 = 60 мксек., частота - F/3
Ну и тд, чем больше, тем больше возможностей
для изменения скважности меандрика.
Но, пардон, как можно сгенерировать меандр с периодом
в 2.5 периода дикретизации?!?
Или в 100 с половиной?
---
Может, вы Фурьёвое преобразование имеете ввиду?
Так оно само по себе в дискретном виде неточно.
Скажем, если синус раскладывать, то одна гармоника
получится тогда и только тогда, когда будет взято целое
число периодов этого синуса.
20 апреля 2024 года состоится Концерт «Вивальди. Времена года. Бах. Токката и фуга ре минор. Моцарт. Маленькая ночная серенада»
Сегодня вы услышите знаменитые сочинения, которые принято называть...
20 апреля 2024 года состоится Концерт «Рок-баллады. Scorpions, Metallica, Queen, The Beatles»
Мы приглашаем вас провести вечер под звуки несравненных культовых композиций. О каждой из них можно...
20 апреля 2024 года состоится Концерт «Созвездие черных легенд»
Новый проект Симфонического оркестра Москвы «Русская филармония» «Созвездие черных легенд»! Michael Jakson, Boney M, Whitney Houston,...
Социальные закладки