Программирование на языке ассемблера для MS DOS

Автор: Пользователь скрыл имя, 16 Декабря 2010 в 01:06, лабораторная работа

Описание работы

Цель работы
Получить практические навыки работы с устройствами компьютера через порты ввода-вывода. Научиться генерировать звуковые фрагменты с помощью внутреннего динамика ЭВМ.

Работа содержит 1 файл

1.doc

— 310.50 Кб (Скачать)
 

Коротко рассмотрим средства нотной графики, которые  используются для формализованной  записи музыкального произведения.

Обозначения относительной длительности нот представлены на рис. 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