Музыка
Для того чтобы полноценно понимать, что происходит и как работает SID чип на Commodore 64, нужно изучить его архитектуру, так сказать покопаться внутри, освоить с нуля. В связи с этим я решил привести примеры и описания от производителя С64. Это поможет разобраться с основными функциями работы SID чипа. А в дальнейшем Вам будет легче писать музыку на всевозможных трэкерах, созданных для Commodore 64.
SID (Звуковое Интерфейсное Устройство) чип содержит 29 8-битовых регистров, пронумерованных от 0 до 28, каждый из которых ответственен за определенный компонент звуковой генерации.На данном этапе мы будем работать только с первыми 25 регистрами. Они находятся в промежутке памяти С64 от 54272 до 54296 включительно.
Ниже приведена таблица регистров SID чипа:
Номера регистров Описание
0-6 голос 1
7-13 голос 2
14-20 голос 3
21 низкая частота
22 высокая частота
24 регулировка громкости и фильтры
Прежде, чем мы продолжим обсуждать, как создаются звуки, наберите на С64 нижеприведенную программу и запустите ее. Это продемонстрирует кое-что из того, что можно достигнуть SID чипом.
5 S=54272
10 FORL=S TO S+24:POKEL,0:NEXT
20 POKES+5,9:POKES+6,0
30 POKES+24,15
40 READ HF,LF,DR
50 IF HF < 0 THEN END
60 POKES+1,HF:POKES,LF
70 POKES+4,33
80 FORT=1 TO DR:NEXT
90 POKES+4,32:FOR T=1 TO 50:NEXT
100 GOTO 40
110 DATA 25,177,250,28,214,250
120 DATA 25,177,250,25,177,250
130 DATA 25,177,125,28,214,125
140 DATA 32,94,750,25,177,250
150 DATA 28,214,250,19,63,250
160 DATA 19,63,250,19,63,250
170 DATA 21,154,63,24,63,63
180 DATA 25,177,250,24,63,125
190 DATA 19,63,250,-1,-1,-1
Строка 5 задает точку отсчета для регистров SID чипа и присваивает это значение переменной S. Все другие регистры оказываются доступны при помощи прибавления их значения (числа) к переменной S.
Строка 10 очищает регистры (обнуляет).
Регулировка громкости
У Вашего Commodore 64 есть 16 уровней громкости звука, пронумерованных от 0 (выключено) до 15 (максимальная громкость). Регистр 24 в SID чипе управляет громкостью звука. Чтобы регулировать громкость, Вы просто ставите с утверждением POKE нужную величину в этот регистр. Строка 30 в вышеприведенной программе устанавливает максимальную громкость звука (15). Обычно уровень громкости задается в начале программы. Стоит отметить, что громкость звука задается сразу для всех трех голосов Вашего С64.
Голоса
У Вашего Commodore 64 есть три голоса, которые могут играться отдельно или одновременно. Таблица регистров для каждого голоса приведена ниже:
Номера регистров
Голос 1 Голос 2 Голос 3 Описание
0 7 14 Низкочастотное значение
1 8 15 Высокочастотное значение
2 9 16 Нижняя ширина импульса
3 10 17 Верхняя ширина импульса
4 11 18 Контрольный регистр
5 12 19 Параметры настройки ATTACK/DECAY
6 13 20 Параметры настройки SUSTAIN/RELEASE
Частота
Звук создается движением воздуха. Подумайте о броске камня в бассейн и образовавшихся при этом волнах на поверхности воды. Когда подобные волны создаются в воздухе, мы слышим звук. Каждый звук, произведенный на Вашем С64, составлен из верхнего уровня и нижнего уровня значений частот. У каждого из этих трех голосов есть два регистра в которые помещаются значения частот. Два значения объединяются каждым голосом, чтобы сформировать значение частоты в 16-ти битной форме.
Таблица, показывающая местоположения регистров в памяти С64 для высоких и низких частот каждого голоса приведена ниже:
Голос Частота POKE значение
1 высокая 54273
1 низкая 54272
2 высокая 54280
2 низкая 54279
3 высокая 54287
3 низкая 54286
Чтобы сыграть музыкальную ноту или извлечь звук, Вы должны при помощи POKE установить значение высокой частоты звука в высокочастотное местоположение голоса и значение низкой частоты в низкочастотное местоположение голоса. Строка 60 в вышеприведенной программе устанавливает высокие и низкие частоты из считанных данных в регистры 1 и 0 соответственно. Что и устанавливает частоту для голоса 1.
Создание Других Частот
Для создания частот используется следующая формула:
F = FYOUT / .06097
где FYOUT - частота, которая Вам требуется.
Чтобы создать значение для высокой и низкой частоты, Вы должны сначала преобразовать F в целое число, то есть удалить любые числа справа от запятой.
Потом используйте эту формулу, чтобы вычислить высокочастотное значение:
HI = INT(F/256)
и следующая формула, чтобы дать Вам низкочастотное значения:
LO = F - (256 * HI)
Теперь Вы можете ставить значения высоких и низких частот в регистры нужного Вам голоса для получения звука.
Формы волны
Тип формы волны, которую Вы выбираете, определяет тембр и качество производимого звука.
Есть четыре типа форм волны:
Треугольник.
Эта форма волны содержит немного гармоники и мягкий, подобный флейте звук. Форма волны треугольника похожа на это:
Пилообразная форма (зуб пилы).
Эта форма волны содержит всю гармонику. Она обладает ярким, вызывающим звучанием. Вот то, на что похожа пилообразная форма волны:
Импульсная форма волны (переменная).
Эта форма волны содержит переменные прямоугольные волны.Изменение ширины импульса делает звуки в пределах от яркого, полого шума до пронзительного, носового. Вот то, на что это похоже:
Белый шум.
Эта форма волны используется, главным образом, для звуковых эффектов (взрывы, выстрелы, прибой) в диапазоне от низкого грохота до шипения. Вот на что она похожа:
Форма волны для каждого голоса имеет свой контрольный регистр. Регистры пронумерованы 4, 11 и 18 соответственно. Составные части контрольного регистра для каждого голоса следующие:
№ бита ОПИСАНИЕ
0 ворота
1-3 не используются
4 форма волны треугольника
5 пилообразная форма волны
6 импульсная форма волны
7 шумовая форма волны
Бит «ворота» является средством управления Генератором звука (ATTACK/DECAY/SUSTAIN/RELEASE). Когда этот бит имеет значение 1, он вызывает Генератор звука и начинается цикл ATTACK/DECAY/SUSTAIN . Когда бит перезагружен на ноль, начинается цикл RELEASE. Установка битов 4, 5 или 6 на значение 1 выбирает форму волны.
Строка 70 в вышеприведенной программе устанавливает выход звука для голоса 1, используя Пилообразную форму волны. Эта строка также устанавливает бит «ворота». Вы можете поменять комбинацию этих битов, то есть поставить, к примеру, импульсную форму вместо пилообразной формы, но такая комбинация приведет к довольно странным звукам!
Генератор звука
Звучание музыкальной ноты изменяется с момента ее начала, когда Вы ее услышали до момента полного затухания, когда Вы ее уже не можете слышать. Когда нота взята, она повышает уровень звучания от нуля до его пикового уровня. Фазу, при которой это происходит, называют ATTACK (атака, подъем, штурм). Когда уровень падает от пика до средней громкости звука. то такую фазу называют DECAY (распад). Среднюю фазу называют SUSTAIN (выдержка). Когда нота прекращает играть, то есть, уровень падает от SUSTAIN до нулевого значения, то такую фазу называют RELEASE (выход, выпуск).
Ниже приведена иллюстрация 4 фаз ноты
Каждый из циклов показанных выше придает определенные свойства звуку.
Эти фазы вместе называются параметрами. ATACK/DECAY/SUSTAIN/RELEASE параметры сокращенно называют ADSR.
Для каждого из трех голосов существуют по два регистра, используемых для параметров ADSR. Регистры 5 и 6 для голоса 1, 12 и 13 для голоса 2 и 19 и 20 для голоса 3. ATTACK/DECAY параметры используют первый из каждой пары регистр (5, 12, 19), в то время как SUSTAIN/RELEASE параметры используют второй из каждой пары регистр (6, 13 и 20).
Такое соединение используется, потому что параметры настройки требуют всего 4 бита или половину байта. Такое количество битов для хранения информации называют Ниббл (полубайт). Первые четыре бита байта называют верхним нибблом, а последние четыре бита называют нижним нибблом. Параметры настройки ATTACK для этих трех голосов хранятся в верхнем ниббле регистров 5, 12 и 19, в то время как параметры настройки DECAY хранятся в нижнем ниббле этих регистров. SUSTAIN параметры настройки для этих трех голосов используют верхний ниббл в регистрах 6, 13 и 20, в то время как параметры настройки RELEASE используют нижний ниббл в тех же самых регистрах.
Перед тем, как устанавливать значения ADSR в регистры следует сначала объединить верхний и нижний нибблы, складывая их вместе. Например, фаза ATTACK занимает верхний ниббл, т.е. 2^7, 2^6, 2^5, и 2^4 степени, таким образом, получаются значения 128, 64, 32 и 16.
Фаза DECAY использует нижний ниббл, т.е. 2^3, 2^2, 2^1 и 2^0 степени, или 8, 4, 2 и 1. Предположим, что Вы хотите установить значение ATTACK (12) и значение DECAY (2). Легкий способ объединить эти два показателя состоит в том, чтобы умножить значение ATTACK на 16 и сложить со значением DECAY.
На нашем примере получается значение 194, то есть 12*16+2. Можно использовать эту формулу всякий раз, когда нужно объединить два значения верхнего и нижнего ниббла (диапазон 0-15).
Строка 20 в вышеприведенной программе в качестве примера устанавливает уровень ATTACK/DECAY на 0 ATTACK и 9 DECAY.
Максимальное значение ATTACK может быть 240 (15*16). Можно увеличить и уровень DECAY до 15, складывая вместе все значения, то есть 8 + 4 + 2 + 1 = 15 (максимальное значение для DECAY).
Ниже приведен пример программы, которая иллюстрирует то, что можно сделать с параметрами настройки ATTACK/DECAY:
10 FORL= 54272TO54296:POKEL,0: NEXT Очистка SID чипа
20 POKE54296,15 Установка максимального уровня громкости
30 POKE54277,64 Установка ATTACK/DECAY
40 POKE54273,162:POKE54272,37 Нота для голоса 1
50 PRINT"PRESS ANY KEY" Сообщение на экран
60 GETK$:IFK$= “” THEN60 Ожидание нажатия клавиши на клавиатуре
70 POKE54276,17:FORT = 1TO200:NEXT Старт треугольной формы волны
80 POKE54276,16:FORT = 1TO50:NEXT Конец звучания
90 GOT050 Переход к строке 50
После того, как Вы запустите программу несколько раз, попробуйте изменить параметры ATTACK/DECAY в строке 30:
30 POKE 54277,190
Теперь, после запуска программы, обратите внимание на изменение звучания ноты. Попробуйте другие комбинации ATTACK/DECAY, чтобы понять, как можно использовать различные показатели для создания множества звуковых эффектов.
Параметры SUSTAIN/RELEASE.
Как ATTACK/DECAY, SUSTAIN/RELEASE имеют полубайтовую систему. Но помните, что это разделение не означает, что SUSTAIN и RELEASE похожи. SUSTAIN это так называемый уровень выдержки звука, в то время как RELEASE, ATTACK и DECAY это установочные параметры (показатели) звука. SUSTAIN выдерживает звук на любом уровне громкости.
Примечание: Можно увеличивать SUSTAIN уровень путем складывания вместе всех значений SUSTAIN: 128 + 64 + 32 + 16 = 240 (максимум). Уровень SUSTAIN равный 128 составляет приблизительно 50 % . Можно увеличивать и уровень RELEASE, складывая вместе все его значения: 8 + 4 + 2 + 1 = 15 (максимум).
Объедините SUSTAIN уровень и RELEASE уровень тем же самым путем, что и ATTACK/DECAY и поставьте общее значение при помощи POKE в нужный регистр для соответствующего голоса.
Добавьте строку 35 к вышеприведенной программе:
35 POKE 54278,128
Теперь запустите программу снова и обратите внимание на изменения.
Со строкой 35, мы скажем, что компьютер выдерживает ноту на Верхнем уровне SUSTAIN (128). Можно изменить продолжительность звучания ноты, изменяя значения в цикле строки 70. Помните, что SUSTAIN уровень выдерживает ноту пропорционально ее громкости звучания, поскольку звук уменьшается от своего пикового уровня; это не то же самое, что длительность звучания ноты (строка70).
Чтобы увидеть эффект уровня RELEASE, попробуйте изменить строку 35:
35 POKE 54278,89 (SUSTAIN = 80, RELESE = 9).
Для ADSR существуют условные побитовые названия уровня:
128 - Верхний уровень ATTACK или SUSTAIN
64 - Средний уровень ATTACK или SUSTAIN
32 - Нижний уровень ATTACK или SUSTAIN
16 - Малый уровень ATTACK или SUSTAIN
8 - Верхний уровень DECAY или RELEASE
4 - Средний уровень DECAY или RELEASE
2 - Нижний уровень DECAY или RELEASE
1 - Малый уровень DECAY или RELEASE
Следующая программа подводит итог того, что мы до сих пор изучили
про создание музыки на Commodore 64.
1. Выберите голос, который Вы хотите использовать. Вспомните, что каждый голос использует различные местоположения памяти, в которые Вы при помощи утверждения POKE устанавливаете значения для формы волны, различных частот и т.д. Можно проиграть 1, 2 или 3 голоса вместе, но эта программа использует голос №1.
2. Очистите SID чип: 5 FORL=54272TO54296:POKEL,0:NEXT
3. Установите громкость: 10 POKE54296,15
4. Установите нужное значение
ATTACK/DECAY (0-255): 20 POKE54277,190
5. Установите нужное значение
SUSTAIN/RELEASE (0-255): 30 POKE54278,248
6. Задайте высокочастотное и
низкочастотное значения для ноты: 40 POKE54273,16:POKE54272,195
7. Задайте форму волны,
например – треугольная: 50 POKE54276,17
8. Задайте время звучания
ноты с помощью цикла,
в принципе возможно
любое, у нас = 250: 60 FORT=1TO250:NEXT
8. Задайте параметры для
остановки звучания ноты,
отключения формы волны: 70 POKE54276,16
Вот более длинная программа, которая демонстрирует способности Вашего С64 :
5 REM MUSICAL SCALE Ремарка (пояснение)
7 FORL= 54272T054296:POKEL,0:NEXT Очистка SID чипа
10 POKE 54296,15 Установка громкости
20 POKE54277,7:POKE54278,133 Установка ADSR
50 READ A Считывание первого числа из строки 110
55 IF A = - 1 THENEND Конец цикла
60 READ B Считывание второго числа из строки 110
80 POKE54273,A:POKE54272,B Установка считанных чисел из строки 110
А-высокая частота; В-низкая частота
85 POKE54276,17 Старт звучания (волна)
90 FORT=1ТО250:NEXT:POKE54276,16 Проигрыш ноты и остановка
95 FORT=1ТО50:NEXT
100 GOTО20 Повтор программы со строки 20
110 DATA 16,195,18,209,21,31,22,96 Значения частот для нот
120 DATA 25,30,28,49,31,165,33,135
999 DATA-1 Конец программы (строка 55)
Можно изменить форму волны на пилообразную, поменяв параметры строки 85 на POKE54276,33 и строки 90 на FORT = 1 TO 250:NEXT:POKE54276,32.
Изменение формы волны может резко изменить звук, который выдает Ваш компьютер.
Можно изменить звук и другим путем. Например, можно изменить подобный клавесину звук в предыдущей программе на банджо, изменяя уровень ATTACK/DECAY. Поменяйте параметры в строке 20:
20 POKE54277,3:POKE54278,0 Создание банджо эффекта, благодаря
нулевым SUSTAIN/RELEASE
Как показывает данная программа, С64 может синтезировать различные инструменты.
ПРОИГРЫШ ПЕСНИ НА ВАШЕМ С64
Следующая программа позволяет Вам сыграть строку из песни, "Michael Row Your Boat Ashore". Программа использует импульсную форму волны. Третье и четвертое значение POKE в строке 10, определяют ширину верхнего и нижнего значения импульса для этой песни.
В этой песне мы используем значение продолжительности 125 для восьмой ноты, 250 для четвертной ноты, 375 для пунктирной четвертной ноты, 500 для половины ноты, и 1000 для целой ноты. Когда Вы программируете свои собственные песни, можно увеличить или сократить эти значения, чтобы установить особый темп или задать значения соответствующие Вашему собственному музыкальному вкусу.
2 FORL=54272 TO 54296:POKEL,O:NEXT
5 S=54272
10 POKES+24,15:POKES+5,88:POKES+3,15:POKES+2,15:POKES+6,89
20 READH:IFH= -1 THEN END
30 READL
40 READD
60 POKES + 1,H: POKES,L:POKES+4,65
70 FORT=1 TO D:NEXT:POKES+4,64
80 FORT=1 TO 50:NEXT
90 GOTO 20
100 DATA 33,135,250,42,62,250,50,60,250,42,62,125,50,60,250
105 DATA 56,99,250
110 DATA 50,60,500,0,0,125,42,62,250,50,60,250,56,99
115 DATA 1000,50,60,500
120 DATA -1
Строка 2 очищает SID чип.
Строка 5 присваивает самый низкий (первый) адрес в памяти SID чипа переменной S.
В остальной части программы мы только добавляем значение регистра SID к этой переменной. Например, POKES + 24,15, устанавливаем значение 15 в регистр громкости, коим является адрес 54296, или 54272 + 24.
Строка 10 устанавливает значения в:
1. Регистр громкости: POKES + 24,15
2. Голос 1, значения ATACK/DECAY: POKES + 5,88
3. Ширину импульса: POKES + 3,15 и POKES + 2,15
4. Голос 1, значения SUSTAIN/RELEASE: POKES + 6,89
Строка 20 считывает первое значение из утверждения DATA. Если это число -1, программа автоматически останавливается. Это происходит, когда считываются данные из строки 120.
Строка 30 считывает второе значение из списка данных.
Строка 40 считывает третье значение из списка данных.
Строка 60 устанавливает при помощи POKE:
1. Значение H в высокочастотный регистр.
2. Значение L в низкочастотный регистр. Вместе эти два значения составляют одну ноту.
3. Значение импульсной формы волны для голоса 1.
Строка 70 использует цикл, чтобы установить продолжительность для играемых нот. А также отключает импульсную форму волны.
Значение D назначается в строке 40. Как можно видеть, значения в списке данных группируются в тройки: первое число (35) является высокочастотным значением для ноты, второе число (135) - низкочастотным значением для ноты и третье число (250) устанавливает продолжительность для той же самой ноты (например, четвертная нота C).
Строка 80 – цикл, который определяет время между звучанием нот.
Строка 90 отсылает программу назад, чтобы считать следующее значение данных для ноты.
Строки 100 - 120 содержат все данные для отрезка из песни.
СОЗДАНИЕ ЗВУКОВЫХ ЭФФЕКТОВ
SID чип Вашего С64 позволяет Вам создавать большое разнообразие звуковых эффектов, таких как взрыв во время игры или гудок, который предупреждает Вас о том, что Вы сделали ошибку.
Вот несколько предложений для того, чтобы создать звуковые эффекты:
1. Быстро измените значения для двух нот, чтобы создать звук сотрясения.
2. Используйте мультиголосовые эффекты, таким образом, у Вас будут разные звучания нот сразу. Или используйте один голос в качестве эха или ответа на другой голос.
3. Используйте разную ширину импульса, чтобы создать различные звуки.
4. Используйте шумовую форму волны для создания взрыва, выстрелов, шагов. Когда Вы используете шумовую форму волны с теми же музыкальными нотами, которые создают музыку, можно создать различные типы шума.
5. Объедините несколько высоких/низких частот в быстрой последовательности через различные октавы.
Вот некоторые типовые программы звуковых эффектов.
ПЛАЧ КУКЛЫ
NEW
5 FORL=54272T054296:POKEL,0:NEXT Очистка SID чипа
10 S = 54272:POKE 54275,15:POKE 54274,40
20 POKES + 24,15 Установка громкости
30 POKES + 4,65 Установка формы волны
40 POKES + 5,15 Установка ATTACK/DECAY
50 FORX = 200T05STEP-2 Цикл выпуска ноты и
времени звучания
60 POKES+1,40:POKES,X:NEXT Установка частот ноты
70 FORX = 150 TO 5 STEP-2 Более быстрый цикл выпуска
80 POKES + 1,40:POKES,X:NEXT Установка частот ноты
90 POKES + 4,0 Выключение формы волны
СТРЕЛЬБА
NEW
5 FORL= 54272T054296:POKEL,0:NEXT Очистка SID чипа
10 S= 54272
20 FORX= 15 TO 0 STEP-1 Цикл для громкости
30 POKES + 24,X Установка громкости
40 POKES + 4,129 Установка формы волны
50 POKES + 5,15 Установка ATTACK/DECAY
60 POKES + 1,40 Высокочастотное значение
70 POKES,200:NEXT Низкочастотное значение
80 POKES + 4,128 Выключение формы волны
90 POKES + 5,0 Значение 0 в ATTACK/DECAY
100 GOT020 Повтор программы
Цикл, который начинается со строки, делает уровень громкости понижающимся от 15 до 0. Так выстрелы кажутся более реальными.
Нажмите клавишу RUN/STOP, чтобы закончить эту программу.
Как мы и говорили раньше, лучший способ узнать больше, это больше экспериментировать.
ФИЛЬТРОВАНИЕ
Иногда определенная форма волны не дает того тембра, который Вы хотите получить. Например, было бы трудно вообразить любую из заданных форм волны SID чипа в форме трубы. Чтобы дать Вам дополнительный контроль над звуковыми параметрами, SID чип оборудован тремя фильтрами.
ФИЛЬТР ВЫСОКИХ ЧАСТОТ.
Этот фильтр уменьшает уровень нижней частоты среза. Он проходит все частоты на уровне или выше частоты среза.
ФИЛЬТР НИЗКИХ ЧАСТОТ.
Как следует из названия, этот фильтр пропускает частоты ниже среза и уменьшает верхний уровень .
ПОЛОСОВОЙ ФИЛЬТР.
Этот фильтр проходит в узкой полосе частот около среза и уменьшает уровень всех остальных.
Дополнительный фильтр.
Названный фильтром отклонения может быть синтезирован, при помощи комбинаций фильтров высоких и нижних частот, уменьшает уровень в частоте среза.
Регистр 24 определяет, какой тип фильтра Вы хотите использовать. Помните, что это - также регистр, используемый для регулировки громкости. Следующие биты используются для фильтров:
№ бита фильтр
4 ФИЛЬТР НИЗКИХ ЧАСТОТ
5 ПОЛОСОВОЙ ФИЛЬТР
6 ФИЛЬТР ВЫСОКИХ ЧАСТОТ
Фильтр активизируется, когда Вы устанавливаете соответствующий бит в регистр 24.
Вы не можете фильтровать все голоса одновременно. Регистр 23 определяет, какие голоса должны быть фильтрованы. Используются следующие биты:
№ бита фильтр
7-4 фильтр резонанс 0-15
3 фильтр внешний вход
2 фильтр голос 3
1 фильтр голос 2
0 фильтр голос 1
Когда определенный бит будет установлен, значения для того голоса будут отклонены через фильтр.
Частота среза - число из одиннадцати битов. Верхние восемь битов (11 - 3) хранятся в регистре 22, в то время как более низкие три бита (0 - 2) хранятся в регистре 21. Это дает Вам диапазон значений между 0 и 2047.
Попробуйте добавить следующие линии к самой первой программе в качестве примера, чтобы фильтровать голос и услышать различие в звуке. Мы будем использовать Фильтр низких частот, который позволит только более низким компонентам звуков быть услышанными.
30 POKE S+24,31 Максимальная громкость + фильтр низких частот
35 POKE S+23,1 Установка фильтра для голоса 1
37 POKE S+22 ,128:POKE S+21, 7 Выбранная частота среза
Экспериментируйте с фильтрами. Фильтрование звука, поскольку оно проходит через фазы ADSR, может оказывать интересное влияние на звучание.
Создано на конструкторе сайтов Okis при поддержке Flexsmm - накрутка подписчиков ютуб