title MUSIC.ASM ;Copyright (C) 1990 by B. Simon and R. M. Wilson, all rights reserved. ;-----------------------------------------------------------------; ; ** For use with STACKEY or DOS ** ; ; ; ; This file may be modified by assembly language programmers. ; ; You may change anything in the two boxes like this one. That ; ; is, change the tempo and pitch just below, and the notes in ; ; the middle of this file. (The note data alternates: pitches ; ; and note lengths.) Then assemble, link and exe2bin. Run as a ; ; com file from DOS or as STACKEY ex(music.com) ; ;-----------------------------------------------------------------; ;-----------------------; tempo=300 ; increase to make tempo SLOWER pitch=128 ; increase to LOWER pitch ;-----------------------; n1=16*tempo ;whole note legato (full length) n2=8*tempo ;half note legato (full length) n4=4*tempo ;quarter note legato (full length) n8=2*tempo ;eighth note legato (full length) n16=tempo ;sixteenth note legato (full length) n32=tempo/2 ;32nd note legato (full length) n1d=16*tempo +4000h ;whole note detached (3/4 length) n2d=8*tempo +4000h ;half note detached (3/4 length) n4d=4*tempo +4000h ;quarter note detached (3/4 length) n8d=2*tempo +4000h ;eighth note detached (3/4 length) n16d=tempo +4000h ;sixteenth note detached (3/4 length) n32d=tempo/2 +4000h ;32nd note detached (3/4 length) n1s=16*tempo +8000h ;whole note staccato (1/2 length) n2s=8*tempo +8000h ;half note staccato (1/2 length) n4s=4*tempo +8000h ;quarter note staccato (1/2 length) n8s=2*tempo +8000h ;eighth note staccato (1/2 length) n16s=tempo +8000h ;sixteenth note staccato (1/2 length) n32s=tempo/2 +8000h ;32nd note staccato (1/2 length) rest= 0 ; Just for fun, we use "just intonation". c0=64*pitch c1=32*pitch c2=16*pitch c3=8*pitch c4=4*pitch c5=2*pitch c6=pitch d1=32*pitch*8/9 d2=16*pitch*8/9 d3=8*pitch *8/9 d4=4*pitch *8/9 d5=2*pitch *8/9 d6=pitch *8/9 e1=32*pitch*4/5 e2=16*pitch*4/5 e3=8*pitch *4/5 e4=4*pitch *4/5 e5=2*pitch *4/5 e6=pitch *4/5 f1=32*pitch*3/4 f2=16*pitch*3/4 f3=8*pitch *3/4 f4=4*pitch *3/4 f5=2*pitch *3/4 f6=pitch *3/4 g1=32*pitch*2/3 g2=16*pitch*2/3 g3=8*pitch *2/3 g4=4*pitch *2/3 g5=2*pitch *2/3 g6=pitch *2/3 a1=32*pitch*3/5 a2=16*pitch*3/5 a3=8*pitch *3/5 a4=4*pitch *3/5 a5=2*pitch *3/5 a6=pitch *3/5 bf1=32*pitch*9/16 bf2=16*pitch*9/16 bf3=8*pitch *9/16 bf4=4*pitch *9/16 bf5=2*pitch *9/16 bf6=pitch *9/16 b1=32*pitch*8/15 b2=16*pitch*8/15 b3=8*pitch *8/15 b4=4*pitch *8/15 b5=2*pitch *8/15 b6=pitch *8/15 ;------------------------------------------- cseg segment assume cs:cseg begin: xor dx,dx ;Time the processor to get an approximate push ds ;machine independent note length. xor ax,ax mov ds,ax mov al,byte ptr ds:[46CH] up2886:mov ah,byte ptr ds:[46CH] cmp ah,al je up2886 inc9823: inc dx mov cx,4*138 here6: loop here6 mov al,byte ptr ds:[46CH] cmp al,ah je inc9823 pop ds call overmusic music label word ;----------------------------------------------------------------------; dw e2,n4d ;Gavotte I from Bach's Orch. Suite #1 in C ; dw f2,n4s ; dw g2,n4d ; dw a2,n8d, f2,n8d ; dw g2,n4d, c2,n4s, a2,n4d, f2,n4s, d2,n4d, e2,n4s, f2,n4d ; dw g2,n8d,e2,n8d,f2,n8d,d2,n8d,g2,n4s ; dw f2,n16,e2,n16,f2,n16,e2,n16s ;trill on e2,n4d ; dw d2,n8,c2,n8d ; dw f2,n8,e2,n8,d2,n8,c2,n8d ; dw d2,n4d,e2,n8d,c2,n8d,d2,n8d,b1,n8d,e2,n4s ; dw d2,n16,c2,n16,d2,n16,c2,n16s ;trill on c2,n4d ; dw b1,n8,a1,n8d ; dw d2,n8,c2,n8,b1,n8,a1,n8d ; dw d2,n4d,g2,n4s ; dw c2,n16,b1,n16,c2,n16,b1,n16s ;trill on b1,n4d ; dw a1,n8d,g1,n8s ; dw g1,n2 ; ; ;The following line is Pop Goes the Weasel, if you prefer that. ; ;dw a2 ,n2s, d2 ,n4d, f2 ,n4s, e2 ,n2, c2 ,n2d ; ;----------------------------------------------------------------------; dw -1 overmusic: pop si ;points to music shl dx,1 mov word ptr ds:[offset timer2 +1-offset music+si],dx note: lodsw cmp ax,-1 je done or ax,ax je ov2 ;rest mov cx,ds:[si] mov bx,cx and ch,0111111B mov dx,cx shr dx,1 test bh,0C0h je ov3 ;legato if equal test bh,80h jne ov4 ;staccato if not equal shr dx,1 ;else detached ov4: sub cx,dx call setup call timer2 mov cx,dx call timer2 inc si inc si jmp note ov3: call setup ov2: push ax lodsw mov cx,ax pop ax call timer2 jmp note setup: dec si dec si mov al,0b6H out 43H,al lodsb out 42H,al lodsb out 42H,al in al,61H or al,3 out 61H,al ret timer2: mov bx,0000 ;will be filled in with a number decbx: dec bx jg decbx loop timer2 and al,0FDH ;turn off speaker out 61H,al done: ret cseg ends end begin