Микроконтроллеры AVR довольно дешевы и широко распространены. Наверно, с них начинает почти любой embedded разработчик. А среди любителей правит балом Arduino, сердцем которого обычно является ATmega328p. Наверняка многие задумывались: как можно заставить их звучать? Если посмотреть на существующие проекты, то они бывают нескольких типов:

  1. Генераторы квадратных импульсов. Генерация с помощью ШИМ или дергать пины в прерываниях. В любом случае, получается очень характерный пищащий звук.
  2. Использование внешнего оборудования типа MP3 декодера.
  3. Использование ШИМ для вывода 8 битного (иногда 16 битного) звука в формате PCM или ADPCM. Поскольку памяти в микроконтроллерах для этого явно не достаточно, то обычно используют SD карту.
  4. Использование ШИМ для генерации звука на основе волновых таблиц, подобных MIDI.

Последний тип для меня был особенно интересен, т.к. почти не требует дополнительного оборудования. Представляю сообществу свой вариант. Для начала небольшое демо:
Заинтересовавшихся прошу под кат. Итак, оборудование:

 

  • ATmega8 или ATmega328. Портировать на другие ATmega не сложно. И даже на ATtiny, но об этом позже;
  • Резистор;
  • Конденсатор;
  • Динамик или наушники;
  • Питание;

Вроде все.
Простая RC цепочка вместе с динамиком подключается к выводу микроконтроллера. На выходе получаем 8 битный звук с частотой дискретизации 31250Гц. При частоте кристалла в 8МГц можно генерировать до 5 каналов звука + один шумовой канал для перкуссии. При этом используется почти все процессорное время, но после заполнения буфера процессор можно занять чем-то полезным помимо звука:

Данный пример полностью помещается в память ATmega8, 5 каналов + шум обрабатываются при частоте кристалла 8МГц и остается немного времени на анимацию на дисплее.

Так же я хотел показать в этом примере, что библиотеку можно использовать не только как очередную музыкальную открытку, но и подключить звук к уже существующим проектам, например, для уведомлений. И даже при использовании всего одного звукового канала уведомления могут быть гораздо интереснее простой пищалки.

 

А теперь подробности…

Волновые таблицы или wavetables

Математика предельно проста. Есть периодичная функция тона, например tone(t) = sin(t * freq / (2 * Pi))
.

Так же есть функция изменения громкости основного тона от времени, например volume(t) = e ^ (- t)

.

 

В самом простом случае звучание инструмента – это произведение этих функций instrument(t) = tone(t) * volume(t)

:

На графике это все выглядит примерно так:

Дальше берем все звучащие в данный момент времени инструменты и суммируем их с некоторыми коэффициентами громкости (псевдокод):

for (i = 0; i < CHANNELS; i++) { value += channels
.tone(t) * channels.volume(t) * channels.volume; } Надо только подбирать громкости так, чтобы не было переполнения. И это почти все.
Шумовой канал работает приблизительно так же, только вместо функции тона генератор псевдослучайной последовательности.

Перкуссия — это микс шумового канала и низкочастотной волны, приблизительно в 50-70 Гц. Конечно, качественного звука таким образом добиться сложно. Но у нас же всего 8 килобайт на все. Надеюсь, это можно простить.

Что можно выжать из 8 бит

Изначально я ориентировался на ATmega8. Без внешнего кварца она работает на частоте 8МГц и имеет 8 битный ШИМ, что дает базовую частоту дискретизации 8000000 / 256 = 31250Гц. Один таймер использует ШИМ для вывода звука и он же при переполнении вызывает прерывание для передачи следующего значения в генератор ШИМ. Соответственно, у нас 256 тактов для вычисления значения сэмпла на все, включая накладные расходы на прерывание, обновление параметров звуковых каналов, отслеживание времени, когда надо проигрывать очередную ноту и т.д.
Для оптимизации будем активно использовать следующие трюки:

  • Поскольку процессор у нас восьмибитный, то переменные будем стараться делать такими же. Иногда будем пользоваться 16 битными.
  • Вычисления условно разделим на частые и не очень. Первые необходимо вычислять для каждого сэмпла, вторые – заметно реже, раз в несколько десятков/сотен сэмплов.
  • Для равномерного распределения нагрузки во времени мы используем циклический буфер. В основном цикле программы мы буфер наполняем, в прерывании вычитываем. Если все хорошо, то наполняется буфер быстрее, чем опустошается и у нас есть время на что-то еще.
  • Код написан на C с большим количеством inline. Практика показывает, что так заметно быстрее.
  • Все что можно просчитать препроцессором, особенно с участием деления, делается препроцессором.

Для начала, разделим время на промежутки по 4 миллисекунды (я назвал их тиками). При частоте дискретизации 31250Гц получаем 125 сэмплов на тик. То, что обязательно нужно считать каждый сэмпл – будем считать каждый сэмпл, а остальное – раз в тик или реже. Например, в рамках одного тика громкость инструмента будет постоянной: instrument(t) = tone(t) * currentVolume
; а сам currentVolume будет пересчитываться раз в тик с учетом volume(t) и выбранной громкости звукового канала.

 

Длительность тика в 4мс была выбрана исходя из простого 8 битного ограничения: при восьмибитном счетчике сэмплов можно работать с частотой дискретизации до 64кГц, при восьмибитном счетчике тиков мы можем измерять время до 1-й секунды.

 

 

Что такое звук

Звук

— это звуковые волны, которые образуются в результате колебаний и изменения атмосферы, а также объектов вокруг нас.

Даже при разговоре вы слышите своего собеседника потому, что он воздействует на воздух. Также, когда вы играете на музыкальном инструменте, бьете ли вы по барабану или дергаете струну, вы производите этим колебания определенной частоты, которой в окружающем воздухе производит звуковые волны.

Звуковые волны бывают упорядоченные

и
хаотические
. Когда они упорядоченные и периодические (повторяются через какой-то промежуток времени), мы слышим определенную частоту или высоту звука.

То есть мы можем определить частоту, как количество повторения события в заданный промежуток времени. Таким образом, когда звуковые волны хаотичны, мы воспринимаем их как шум

.

 

Но когда волны упорядочены и периодически повторяются, то мы можем измерить их количеством повторяющихся циклов в секунду.

Немного кода

Сам канал описывается такой структурой: typedef struct { // Info about wave const int8_t* waveForm; // Wave table array uint16_t waveSample; // High byte is an index in waveForm array uint16_t waveStep; // Frequency, how waveSample is changed in time // Info about volume envelope const uint8_t* volumeForm; // Array of volume change in time uint8_t volumeFormLength; // Length of volumeForm uint8_t volumeTicksPerSample; // How many ticks should pass before index of volumeForm is changed uint8_t volumeTicksCounter; // Counter for volumeTicksPerSample // Info about volume uint8_t currentVolume; // Precalculated volume for current tick uint8_t instrumentVolume; // Volume of channel } waveChannel; Условно данные тут разделены на 3 части:

  1. Информация о форме волны, фаза, частота.
    waveForm: информация о функции tone(t): ссылка на массив длиной 256 байт. Задает тембр, звучание инструмента.

    waveSample: старший байт указывает на текущий индекс массива waveForm.

    waveStep: задает частоту, на сколько waveSample будет увеличен при подсчете следующего сэмпла.

    Каждый сэмпл считается примерно так:

    int8_t tone = channelData.waveForm[channelData.waveSample >> 8]; channelData.waveSample += channelaData.waveStep; return tone * channelData.currentVolume;

  2. Информация о громкости. Задает функцию изменения громкости от времени. Постольку громкость меняется не так часто, то пересчитывать ее можно реже, раз в тик. Делается это примерно так: if ((channel->volumeTicksCounter—) == 0 && channel->volumeFormLength > 0) { channel->volumeTicksCounter = channel->volumeTicksPerSample; channel->volumeFormLength—; channel->volumeForm++; } channel->currentVolume = channel->volumeForm * channel->instrumentVolume >> 8;
  3. Задает громкость канала и посчитанную текущую громкость.

Обратите внимание: форма волны – восьмибитная, громкость – тоже восьмибитная, а результат – 16 битный. С небольшой потерей производительности можно сделать звук (почти) 16 битным.
При борьбе за производительность пришлось прибегнуть к некоторой черной магии.

Пример номер 1. Как пересчитывать громкость каналов:

if ((tickSampleCounter—) == 0) { // Наступил новый тик tickSampleCounter = SAMPLES_PER_TICK – 1; // Пос

Музыка

Используется восьмибитный счетчик тиков. При достижении нуля начинается новый такт, счетчику присваивается длительность такта (в тиках), чуть позже проверяется массив музыкальных команд.
Музыкальные данные хранятся в массиве байтов. Записывается примерно так:

const uint8_t demoSample[] PROGMEM = { DATA_TEMPO(160), // Set beats per minute DATA_INSTRUMENT(0, 1), // Assign instrument 1 (see setSample) to channel 0 DATA_INSTRUMENT(1, 1), // Assign instrument 1 (see setSample) to channel 1 DATA_VOLUME(0, 128), // Set volume 128 to channel 0 DATA_VOLUME(1, 128), // Set volume 128 to channel 1 DATA_PLAY(0, NOTE_A4, 1), // Play note A4 on channel 0 and wait 1 beat DATA_PLAY(1, NOTE_A3, 1), // Play note A3 on channel 1 and wait 1 beat DATA_WAIT(63), // Wait 63 beats DATA_END() // End of data stream }; Все что начинается с DATA_ – препроцессорные макросы, которые разворачивают параметры в необходимое количество байт данных.

Например, команда DATA_PLAY разворачивается в 2 байта, в которых хранятся: маркер команды (1 бит), пауза перед следующей командой (3 бита), номер канала, на котором играть ноту (4 бита), информация о ноте (8 бит). Самое существенное ограничение – этой командой нельзя делать большие паузы, максимум 7 тактов. Если надо больше, то надо использовать команду DATA_WAIT (до 63 тактов). К сожалению, я так и не нашел, можно ли макрос развернуть в разное количество байт массива в зависимости от параметра макроса. И даже warning не знаю как вывести. Может быть вы подскажите.

 

Как работать со звуковой программой Hear

Итак, мы рассмотрим известную программу Hear. Это очень удобная программа, позволяющая создать объёмный звук, даже, если у вас колонки или наушники не очень хорошего качества. Или просто тихие. Данная программа позволяет повысить громкость звука. Многие пользователи утверждают, что она даёт эффект, не уступающий звуковой плате.

Программа платная, но, на официальном сайте есть пробная версия. Также, можно программу Hear скачать бесплатно, с одного из торрент сайтов. Программа англоязычная. Я искал Hear на русском, но не нашел. Да он нам особо и не нужен. Интерфейс у неё и так понятный.

Устанавливаем Hear. Во время установки, у вас несколько раз спросят, согласны ли вы на установку этой программы эквалайзера? Соглашаемся. Итак, начинаем работать с этой звуковой программой. Но, для начала, на всякий случай, я советую создать точку восстановления ОС, чтобы, в случае неправильных настроек, можно было произвести откат системы.

Первым делом, сделаем Hear устройством по умолчанию для работы со звуком. Если вам не понравится то, что вы сделали, вы можете вернуть прежнее устройство (динамики) по умолчанию. Для этого, войдем в панель управления, и выберем ярлык «Звук».

Затем, во вкладке воспроизведение, выбираем Hear. Эти действия для Windows 10.

Для семёрки выбираем меню Аудио, и затем Hear.

Теперь, проверим, действительно ли у вас установлена программа Hear для воспроизведения звуков. Для этого, кликнем по значку динамика в панели быстрого запуска и видим:

При желании, можно выбрать динамики, кликнув по треугольнику вверху.

 

Перейдем к рассмотрению самой программы. Обращаем внимание на самое верхнее меню.

В нём расположены пресеты программы (готовые настройки звуковых эффектов). Например, я выберу Speech. При этом, буква S в стилях говорит о том, что данный стиль существует для того, чтобы прослушивать звук с колонок. Буква Н о том, что этот стиль нужно прослушивать с наушников.

Теперь, я вам советую включить какую-нибудь музыку, чтобы понять, какой пресет подходит больше вам. Также, пресеты можно создавать самим. Но, об это поговорим позже.

Использование

В каталоге demos есть несколько примеров под разные микроконтроллеры. Но если коротко, то вот кусок из readme, мне добавить особо нечего: #include «../../microsound/devices/atmega8timer1.h» #include «../../microsound/micromusic.h» // Make some settings #define CHANNELS_SIZE 5 #define SAMPLES_SIZE 16 #define USE_NOISE_CHANNEL initMusic(); // Init music data and sound control sei(); // Enable interrupts, silence sound should be generated setSample(0, instrument1); // Use instrument1 as sample 0 setSample(1, instrument2); // Init all other instruments… playMusic(mySong); // Start playing music at pointer mySong while (!isMusicStopped) { fillMusicBuffer(); // Fill music buffer in loop // Do some other stuff } Если хочется еще что-то делать помимо музыки, то можно увеличить размер буфера с помощью BUFFER_SIZE. Размер буфера должен быть 2^n, но, к сожалению, при размере в 256 происходит падение производительности. Пока не разобрался с этим.
Для увеличения производительности можно увеличить частоту внешним кварцем, можно уменьшить количество каналов, можно уменьшить частоту дискретизации. С последним приемом можно использовать линейную интерполяцию, что несколько компенсирует падение качества звука.

Всякие delay не рекомендуется использовать, т.к. процессорное время расходуется впустую. Вместо этого реализован свой метод в файле microsound/delay.h

, который помимо самой паузы занимается наполнением буфера. Данный метод может работать не очень точно на коротких паузах, но на длинных более-менее вменяемо.

Нижние вкладки

Перейдём к нижнему меню. Вкладка General. В ней можно настроить разные эффекты звука, при помощи ползунков. Также, в правой колонке можно отключать или включать нужные вам команды.

Также, я советую рассмотреть вкладку EQ, в которой находится эквалайзер, и который можно менять. Итак, обращаем внимание на команды в правом нижнем углу: Curve – эквалайзер показан в виде графика, Sliders – в виде ползунков.

 

То, что нам и нужно, их можно менять по вашему вкусу. Я имею в виду не только ползунки, но и линию графика.

Ползунки можно поставить так, как у меня на скриншоте. Я думаю – это самый подходящий вариант.

Вкладка Playback — даёт возможность самим настроить опции звука и посмотреть, нет ли ошибок и предупреждений. Если их нет, поле будет чистым.

3D – создаёт объём звукового воспроизведения. Что-то вроде звука со всех сторон, даже при наличии всего двух динамиков. Двигаем ползунки по своему усмотрению.

Ambience – вносит эффект реверберации. Его можно отключить, нажав Enable.

FX – даёт возможность с помощь ползунков как бы перенаправлять звучание в сторону от человека.

Maximizer – регулирует низкие и высокие частоты в наушниках.

BW – даёт возможность слушать музыку в разных режимах. К примеру – утреннее пробуждение, медитация, релаксация.

 

Limiter – позволяет регулировать компрессию.

Space (космос) – наравне с меню 3D создаёт расширенное звучание. Если вы выберите Normal, звук будет слышен сзади. Если Wide – звук будет ближе к вам.

Fidelity – помогает восстановить качество звука, потерянное во время записи.

Speaker – усиливает громкость из колонок. Расширяет масштаб издаваемых частот.

Sub – производит настройки в виртуальном сабвуфере.

Советую почитать: —

Создание своей музыки

Если писать команды вручную, то надо иметь возможность послушать то, что получается. Заливать каждое изменение в микроконтроллер не удобно, особенно если есть альтернатива.
Существует довольно забавный сервис wavepot.com – онлайн редактор JavaScript, в котором надо задать функцию звукового сигнала от времени, и этот сигнал выводится на звуковую карту. Простейший пример:

function dsp(t) { return 0.1 * Math.sin(2 * Math.PI * t * 440); } Я портировал движок на JavaScript, он находится в
demos/wavepot.js
. Содержимое файла надо вставить в редакторе wavepot.com и можно проводить эксперименты. Пишем свои данные в массив soundData, слушаем, не забываем сохранять.

 

Отдельно стоит упомянуть о переменной simulate8bits. Она, согласно названию, симулирует восьмибитный звук. Если вдруг покажется, что барабаны гудят, а в затухающих инструментах при тихом звуке появляются помехи, то это оно, искажение восьмибитного звука. Можно попробовать отключить эту опцию и послушать разницу. Проблема гораздо менее ощутима, если в музыке нет тишины.

Зачем нужна акустика?

Перед выбором акустической системы нужно четко определиться с основными потребностями и назначением системы. Если покупатель любит вкусно поиграть в современные игры и посмотреть кино, то в диапазоне цен до 2000 рублей и мощности до 40 Вт идеалом будет система 2.1. Если же основное назначение акустики — воспроизводить музыку (какую именно — значения не имеет), тогда вполне может подойти стереопара сопоставимой мощности. Skype и звуковые сигналы Windows можно послушать и на недорогих пищалках базового уровня мощностью по 5 Вт на канал.

Подключение

В простом варианте схема выглядит так: +5V ^ MCU | +——-+ +—+VC | R1 | Pin+—/\/\—+——> OUT | | | +—+GN | === C1 | +——-+ | | | — Grnd — Grnd Выходной пин зависит от микроконтроллера. Резистор R1 и конденсатор C1 надо подбирать исходя из нагрузки, усилителя (если есть) и т.д. Я не электронщик и приводить формулы не буду, их легко нагуглить вместе с онлайн калькуляторами.
У меня R1 = 130 Ом, С1 = 0.33 мкФ. На выход подключаю обычные китайские наушники.

Что там было про 16 битный звук?

Как я говорил выше, при умножении двух восьмибитных чисел (частота и громкость) мы получаем 16 битное число. Его можно не округлять до восьмибитного, а выводить оба байта в 2 ШИМ канала. Если эти 2 канала смешать в пропорции 1/256, то мы можем получить 16 битный звук. Разницу с восьмибитным особенно легко услышать на плавно затухающих звуках и барабанах в моменты, когда звучит только один инструмент.
Подключение 16 битного выхода:

+5V ^ MCU | +——-+ +—+VCC | R1 | PinH+—/\/\—+——> OUT | | | | | R2 | | PinL+—/\/\—+ +—+GND | | | +——-+ === C1 | | — Grnd — Grnd Здесь важно правильно смешать 2 выхода: сопротивление R2 должно быть в 256 раз больше сопротивления R1. Чем точнее, тем лучше. К сожалению, даже резисторы с погрешностью 1% не дают требуемой точности. Однако, даже с не очень точным подбором резисторов искажения можно заметно ослабить.

К сожалению, при использовании 16 битного звука проседает производительность и 5 каналов + шум уже не успевают обрабатываться за отведенные 256 тактов.

А на Arduino можно?

Да, можно. У меня только китайский клон nano на ATmega328p, на нем работает. Скорее всего другие ардуины на ATmega328p тоже должны работать. ATmega168 вроде бы имеет те же регистры управления таймерами. Скорее всего на них будет работать без изменений. На других микроконтроллерах надо проверять, возможно потребуется дописать драйвер.
В demos/arduino328p

есть скетч, но чтобы он нормально открылся в Arduino IDE, его нужно скопировать в корень проекта.

 

В примере генерируется 16 битный звук и используются выходы D9 и D10. Для упрощения можно ограничиться 8 битным звуком и использовать только один выход D9.

Поскольку почти все ардуины работают на 16МГц, то, при желании, можно увеличить количество каналов до 8.

А что с ATtiny?

В ATtiny нет аппаратного умножения. Программное умножение, которое использует компилятор дико медленное и его лучше не использовать. При использовании оптимизированных ассемблерных вставок производительность падает раза в 2 по сравнению с ATmega. Казалось бы, смысла использовать ATtiny нет вообще, но…
На некоторых ATtiny есть умножитель частоты, PLL. А это значит, что на таких микроконтроллерах есть 2 интересные особенности:

  1. Частота генератора ШИМ 64МГц, что дает период ШИМ в 250кГц, что гораздо лучше, чем 31250Гц при 8 МГц или 62500Гц с кварцем на 16 МГц на любых ATmega.
  2. Этот же умножитель частоты позволяет без кварца тактовать кристалл на 16 МГц.

Отсюда вывод: некоторые ATtiny использовать для генерации звука можно. Они успевают обрабатывать те же 5 инструментов + шумовой канал, но на 16 МГц и им не нужен внешний кварц.
Минус в том, что больше частоту уже не повысить, а вычисления занимают почти все время. Для освобождения ресурсов можно уменьшать количество каналов или частоту дискретизации.

Еще один минус в необходимости использования сразу двух таймеров: один для ШИМ, второй для прерывания. На этом, обычно, таймеры и заканчиваются.

Из известных мне микроконтроллеров с PLL могу упомянуть ATtiny85/45/25 (8 ног), ATtiny861/461/261 (20 ног), ATtiny26 (20 ног).

Что касается памяти, то разница с ATmega не велика. В 8кб вполне поместится несколько инструментов и мелодий. В 4кб можно поместить 1-2 инструмента и 1-2 мелодии. В 2 килобайта что-то поместить сложно, но если очень хочется, то можно. Надо разинлайнивать методы, отключать некоторые функции типа контроля громкости по каналам, уменьшать частоту дискретизации и количество каналов. В общем, на любителя, но рабочий пример на ATtiny26 есть.

Много цифр или как в этом разобраться?

Что касается технических характеристик, то самой популярной (на нее чаще всего обращают внимание при выборе устройства) зачастую является выходная мощность

 

, которая указывается в Ваттах — Вт. Но не стоит гнаться за большими цифрами, так как большая мощность еще не гарантирует качественный звук.

Рассмотрим значение характеристик на базе моих домашних стереоколонок TopDevice TDS-510 (мощность — 20 Вт, диапазон частот — 80- 20 000 Гц, динамики — 3″+1″, корпус — МДФ, вес — 2,9 кг).

Воспроизводимая мощность составляет 20 Вт. В значении указано RMS (Rated Maximum Sinusoidal) — это мощность, при которой динамик или колонка может работать в течение одного часа с реальным музыкальным сигналом без физического повреждения. Данной мощности будет достаточно, чтобы наполнить среднюю по размерам комнату звуком и смотреть фильм с комфортом на достаточном удалении от колонок. В контексте обсуждения мощности хочу отметить, что недобросовестные производители порой указывают совершенно неправдоподобные цифры в 100 Вт на колонках размером с апельсин. Надо понимать, что качественный звук могут выдать качественные колонки и нормой будет диаметр в 3−4 дюйма для основных динамиков и мощности в 20−30 Вт. Также отмечу, что для каждого объёма помещения и расстояния, с которого предполагается слушать акустическую систему, есть своя оптимальная мощность, и ощущение громкости зависит от этого соответствия. В моем случае — 30 кв.м. и 4 метра удаления.

Вторая важная характеристика, которой стоит уделить внимание — это диапазон воспроизводимых частот

. В случае с рассматриваемыми колонками — это 80−20000 Гц. Человек способен воспринимать звук в диапазоне 20−20000 Гц, поэтому данные колонки почти полностью перекрывают слуховой диапазон, за исключением самой нижней составляющей. В комплектах 2.1 сабвуфер отвечает как раз за частоты до 300 Гц, дополняя звук басами. Так как низкочастотные звуки хуже локализуются в пространстве и распространяются дальше через препятствия, то сабвуфер чаще всего ставят на пол или куда-либо еще, но на прочную и плотную поверхность.

Диаметр динамиков

обычно указывается в дюймах. В исследуемых колонках указано 3″+1″, это означает, что в каждой колонке используются по два динамика: среднечастотный и высокочастотный. Использование выделенного высокочастотника даёт лучшую детализацию звука.

Вес

 

. При выборе акустики можно вспомнить крайне простое, но действенное правило: чем больше весит комплект — тем лучше. Дерево будет тяжелее пластика, но не страшно, если корпуса сателлитов выполнены из пластика, а сабвуфера — из МДФ (об этом я уже писал выше).

Проблемы

Проблемы есть. И самая большая проблема – это скорость вычислений. Код полностью написан на C с небольшими ассемблерными вставками умножения для ATtiny. Оптимизация отдается компилятору и он иногда ведет себя странно. При небольших изменениях, которые вроде бы не должны ни на что влиять, можно получить заметное просаживание производительности. Причем изменение с -Os на -O3 не всегда помогает. Один из таких примеров – использование буфера размером 256 байт. Особенно неприятно то, что нет гарантии, что в новых версиях компилятора мы не получим падение производительности на том же коде.
Другая проблема в том, что совсем не реализован механизм затухания перед следующей нотой. Т.е. когда на каком-то канале одна нота сменяется другой, то старое звучание резко прерывается, иногда слышен небольшой щелчок. Хотелось бы найти способ избавиться от этого без потери производительности, но пока так.

Нет команд для плавного нарастания/затухания громкости. Особенно критично для коротких мелодий-уведомлений, где в конце надо сделать быстрое затухание громкости, чтобы не было резкого обрыва звучания. Частично проблема обходится написанием череды команд с ручной установкой громкости и короткой паузы.

Выбранный подход в принципе не способен обеспечить натуралистичное звучание инструментов. Для более натуралистичного звучания нужно разделить звуки инструментов на attack-sustain-release, использовать хотя бы первые 2 части и с гораздо большей длительностью, чем один период колебания. Но тогда данных для инструмента потребуется гораздо больше. Была идея использовать более короткие волновые таблицы, например в 32 байта вместо 256, но без интерполяции сильно падает качество звука, а с интерполяцией падает производительность. А еще 8 бит дискретизации явно мало для музыки, но это можно обойти.

Размер буфера ограничен в 256 сэмплов. Это соответствует примерно 8 миллисекундам и это максимальный цельный промежуток времени, который можно отдать другим задачам. При этом выполнение задач все равно периодически приостанавливается прерываниями.

Замена стандартного delay работает не очень точно на коротких паузах.

Уверен, что это не полный список.

Колокольный звон.

Колокольный звон в своей силе, мощи и красоте необычайно целителен для любого человека. Он лечит душу и тело. Он возвышает духовно, восстанавливает и укрепляет физическое здоровье. Благотворному влиянию колокольного звона на человека посвящено много работ.

 

Геофизик П.Кириенко много лет трудилась в лаборатории объединения «Кировгеология», исследовала не только колебания разных участков земли, но изучала свойства вибрации церковных колоколов. И она выяснила, что колокольный звон — генератор энергии. Он излучает большое количество резонансных ультразвуковых волн, проникающих во внутреннюю структуру организма человека, улучшающих формулу крови и работу сосудов. В результате у людей вырабатывается гормон, укрепляющий иммунную систему.

Также замечено, что вибрация, которую рождает колокол, очищает окружающее пространство от болезнетворных микробов. Молекулярные структуры вирусов гриппа, чумы, скарлатины, кори, тифа, холеры сворачиваются и превращаются в кристаллики. Происходит настоящая стерилизация воздуха. Японцы проводили неоднократно исследования влияния колокольного звона на вирусы. Они помещали в стакан с водой различные типы вирусов и ставили стакан под колокол. По результатам этих исследований 90% вирусов после звона погибало. Оставались только самые стойкие. Тогда неугомонные исследователи попробовали проделать то же самое с записью на компакт-диске. Оказалось, что и перед динамиками магнитофона, воспроизводящего русский колокольный звон, погибло до 50% вирусов. Ну а поскольку мы с вами по большей части состоим из воды – ничего удивительного, что после прохождения этих бесподобных вибраций через организм, большая часть вирусов в нем погибает. Поэтому звонари крайне редко страдают именно простудными заболеваниями, хотя постоянно находятся на сквозняках и ветрах, и в повседневной жизни с вирусами сталкиваются не менее других. Удивительное свойство колокольного звона доказали российские медики: эти звуки способны снять боль даже при самых запущенных стадиях рака. Доктор медицинских наук Андрей Гнездилов, основатель первого в России хосписа, провел серию уникальных экспериментов. В палату к онкологическим больным он принес металлические пластины. Такими же по форме были била, которые в древности использовали в монастырях. Они были различного размера, чтобы каждый пациент мог подобрать тональность под себя. Результат получился потрясающий – у трети людей прошел болевой синдром, который не могли снять даже обезболивающие препараты, еще у трети боль стихла настолько, что они легко заснули. Андрей Владимирович считает, что возможно низкий звук входит в резонанс с организмом. Неслучайно колокола в старину использовали как лечебное средство, тогда считалось, что их звон спасает даже от эпидемий.Скорее всего, колокол, словно камертон, дает возможность человеку настроиться на здоровье, тем самым повышая сопротивляемость хворям. Возможно, поймав нужную эталонную частоту, организм сам начинает вытаскивать себя из болезни. Есть у 72-летнего профессора Гнездилова кроме этой гипотезы и другое объяснение целебной силы колоколов. Оно заключается в следующем: в христианской традиции свойственно считать, что колокольный звон изменяет сознание человека настолько, что открывает для его души дорогу к Богу. И Господь, слыша сердечную молитву, посылает облегчение!В реабилитации людей после тяжелых стрессовых ситуаций Андрей Владимирович также использует звучание колокола. Например, он предлагает человеку подойти к звоннице и, выбрав один из колокольчиков, «поиграть». Людям на душу ложатся самые разные звоны и ритмы — тут каждый выбор индивидуален. Вне зависимости от выбранного звона у человека через короткое время исчезает стрессовое состояние, нормализуется давление, улучшается самочувствие. Известны и следующие факты, что низкие звуки колокольного звона успокаивающе действуют на нервную систему человека, а высокие, напротив, взбадривают. Но масштабного «изучения» влияния колокольного звона на организм всё же нет. Все выводы построены только на наблюдениях.А в пользу того, что колокольный звон пробуждает скрытые резервы организма и помогает настроиться на молитвенный лад, свидетельствуют опыты, проведенные в Калифорнийском университете. Там выяснили, что при низких ритмических звуках частотой в 110 герц активность мозга временно смещалась из левой в правую долю, которая отвечает за творчество. Замечено, что среди церковного причта звонари живут дольше всех.

Индийские философы в течение многих веков исцеляли и поддерживали здоровье при помощи речи. Тем, кто обучался пению, известно, как важны физические упражнения для голосовых связок, как они помогают поддерживать в хорошем состоянии горло, область груди и нервную систему. Чёткое пропевание звуков “ом”, “храам”, “хриим”, “хруум”, “храйм”, “храум” и “храа” оказывает благотворное влияние на жизненно важные органы человека.

В книге “Тайная сила музыки” Дэвид Тейм утверждает, что нет ни одной функции в человеческом теле, на которую не оказывала бы влияния музыка. “Исследование показало, что музыка воздействует на пищеварение, внутреннюю секрецию, кровообращение, питание и дыхание… Музыка действует на тело двумя различными путями: прямое воздействие, т.е. влияние звука на клетки и органы, и косвенное – через воздействие на эмоции, которые, в свою очередь, влияют на множество процессов в теле человека”.

Музыка – это сила, которую можно употребить как во благо, так и во зло, и которая является фактором, задающим направление развитию цивилизации.

Аристотель сказал: “Всегда нужно остерегаться введения нового типа музыки как возможной опасности для всего государства, так как изменение стиля музыки всегда сказывается на важнейших аспектах политического уклада”. Наше подсознание, наш организм понимает разницу. 432 Гц — это пробуждение, раскрытие сердечного центра, уровень любви, гармонии, радости. 432 Герца также называют частотой Вселенной. А 440 Гц — это ментальный уровень, уровень эго, контроля, страха и власти. Достаточно сказать, что вся поп-музыка написана на этой частоте (комментарии тут излишни). Небольшой отрывок из брошюры к музыкальному альбому Яноша «Звуковые Активации»: «Музыка в этой шкале соответствует вибрации нашей ДНК, что, также как и голограммы (коды сакральной геометрии), производит исцеляющий эффект. Музыка на частоте 432 Гц успокаивает, звучит яснее и более приятна на слух, а также положительно влияет на чакры: уровень 440 Гц работает на уровне мышления (чакра 3-го глаза), а уровень 432 Гц — расширяет чувствование (сердечная чакра) и ускоряет наш духовный рост. Сакральная геометрия — это язык, на котором мы не говорим, но который чувствуем. Фокусируя взгляд на голограммах, внутри нас активируются и декодируются определённые качества. Геометрические формы существуют как в визуальных образах, так и в звуке. Музыка несёт в себе вибрации, и ритм тела настраивается на частоту Земли и Вселенной.

 

 

От admin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *