Автор: Пользователь скрыл имя, 16 Декабря 2010 в 01:06, лабораторная работа
Цель работы
Получить практические навыки работы с устройствами компьютера через порты ввода-вывода. Научиться генерировать звуковые фрагменты с помощью внутреннего динамика ЭВМ.
Коротко рассмотрим средства нотной графики, которые используются для формализованной записи музыкального произведения.
Обозначения
относительной длительности нот представлены
на рис. 4.
Рис. 4. Обозначения
относительной длительности нот.
Длительность
пауз между нотами обозначается как
на рис. 5.
1 2 3 4
1 – пауза, равная по длительности 1/8 ноты;
2 – пауза, равная по длительности 1/4 ноты;
3 – пауза, равная по длительности 1/2 ноты;
4 – пауза, равная по длительности ноте.
Рис. 5. Обозначения
длительностей пауз между нотами.
Название ноты определяется ее положением на нотном стане с помощью скрипичного или басового ключа (рис. 6).
Рис. 6. Определение
названия нот с помощью ключей.
Как правило, с помощью скрипичного ключа записывается первая октава, а с помощью басового ключа – малая октава.
Произведение делится на равные части, которые называются тактами. Такты отделяются друг от друга тактовой чертой. Каждый такт имеет разное количество долей, число которых указывается цифрами, поставленными в начале произведения около ключа. Эти цифры указывают размер такта. Например, двухдольный размер обозначается 2/4, трехдольный – 3/4, четырехдольный - 4/4. В конце произведения ставится двойная черта. Две точки около двойной тактовой черты указывают, что все произведение или его часть исполняется два раза.
Знак диез # – знак повышения звука на полтона. Знак бемоль ъ – знак понижения звука на полтона.
Абсолютное значение длительности ноты определяется темпом исполнения произведения. Точное значение темпа задается при помощи метронома. В этом случае указывается, сколько звуков определенной длительности должно исполняться за одну минуту. Соответствующая пометка об этом делается в начале произведения или того места, где темп изменяется, например: сто двадцать четвертей в минуту – (MMõ=120).
Так, если
задан темп в 120 четвертей, то музыкальное
произведение, фрагмент которого приведен
на рис. 7, должен исполняться в соответствии
со следующими расчетами: звук, отмеченный
значком четверти, имеет абсолютную длительность
t=60/120=0,5с, соответственно восьмая должна
звучать в два раза меньше, а половина
– в два раза больше. Аналогичным образом
вычисляются и остальные длительности
нот.
Рис. 7. Фрагмент
музыкального произведения
Тогда первые две одноименные слигованные ноты, отображающие один звук, должны исполняться как звук «фа» общей продолжительностью t=t1+t2, где t1 – длительность половины; t2 – длительность восьмой. Таким образом, t=1+0,25=1,25с.
Далее следует пауза, равная 0,25с (восьмая), а затем звук ля-бемоль (четверть) на 0,5с. Во втором такте этот же звук надо повторить и т.д.
При
составлении программы
В соответствии с вариантом задания, составить программу, предусмотрев возможность повторения музыкальной фразы N раз.
Текст программы.
.model small
.stack 100h
.data
msg1 db "Kolichestvo povtoreniy:",0Ah,0Dh,"N = ",'$'
msg2 db "Playing",'$'
msg3 db "Stop",'$'
crlf db 0Ah,0Dh,'$'
count dw ? ; количество повторений
time dw 4 ; длительность ноты
temp dw ? ; высота
ноты
.code
; Процедура формирования задержки:
delay proc
mov ah,0 ; функция для получения циклов таймера
int 1Ah
аdd dx,time ; требуемая задержка
mov bx,dx
repeat: ; цикл проверки окончания времени задержки
int 1Ah
cmp dx,bx
jle repeat
ret
delay endp
; Процедура включения динамика:
sound_on proc
mov al,0B6h ; настройка регистра управления через порт 43h
out 43h,al
in al,61h
mov bl,al
or al,011b
out 61h,al ; включаем динамик
ret
sound_on endp
; Процедура выключения динамика:
sound_off proc
in al,61h
xor bx,bx
mov bl,al
and al,11111100b
out 61h,al ; выключаем динамик
ret
sound_off endp
; Процедура проигрывания ноты:
play_note proc
mov ax,temp
out 42h,al
xchg al,ah
out 42h,al
call delay
ret
play_note endp
print_str proc
mov ah,9
int 21h
ret
print_str endp
new_str proc
mov ah,9
lea dx,crlf
int 21h
ret
new_str endp
main:
mov ax,@data
mov ds,ax
lea dx,msg1
call print_str
mov ah,1
int 21h
xor cx,cx
mov cl,al
sub cl,30h
call sound_on
call new_str
lea dx,msg2
call print_str
call new_str
next:
push cx
call sound_on
mov temp,2861
call play_note
mov temp,1517
mov time,8
call play_note
mov temp,1703
mov time,4
call play_note
mov temp,1941
call play_note
mov temp,2025
call play_note
mov temp,2275
call play_note
mov temp,2275
call play_note
jmp cou
next1: jmp next
cou: mov temp,1941
call play_note
mov temp,2025
call play_note
mov temp,2275
call play_note
mov temp,2551
call play_note
mov temp,2275
call play_note
mov temp,3034
call play_note
mov temp,3406
call play_note
mov temp,3034
call play_note
call sound_off
call delay
pop cx
loop
next1
call sound_off
lea dx,msg3
call print_str
mov ah,1
int 21h
mov ax,4C00h
int 21h
end main
Информация о работе Программирование на языке ассемблера для MS DOS