#### fun for MARS/MIPS/MIDI : "un canon pour MIDI" #### CSC4536 Pascal Hennequin #### original code by Luke Tannenbaum: github.com/TheCodeOfLife/ .data # Pachelbel Canon syscalls: .byte 31, 31, 33, 33, 33, 33, 31, 31, 33, 33, 33, 33, 31, 31, 33, 33, 33, 33, 31, 31, 33, 33, 33, 33, 31, 31, 33, 33, 33, 33, 31, 31, 33, 33, 33, 33, 31, 31, 33, 33, 33, 33, 31, 31, 33, 33, 33, 33 notes: .byte 74, 70, 58, 58, 62, 65, 72, 65, 53, 53, 57, 60, 70, 67, 55, 55, 58, 62, 69, 62, 50, 50, 53, 57, 67, 63, 51, 51, 55, 58, 65, 58, 46, 46, 50, 53, 67, 63, 51, 51, 55, 58, 69, 65, 53, 53, 57, 60 durees: .byte 4, 4, 1, 1, 1, 1, 4, 4, 1, 1, 1, 1, 4, 4, 1, 1, 1, 1, 4, 4, 1, 1, 1, 1, 4, 4, 1, 1, 1, 1, 4, 4, 1, 1, 1, 1, 4, 4, 1, 1, 1, 1, 4, 4, 1, 1, 1, 1 instrums: .byte 19, 19, 30, 48, 48, 48, 19, 19, 30, 48, 48, 48, 19, 19, 30, 48, 48, 48, 19, 19, 30, 48, 48, 48, 19, 19, 30, 48, 48, 48, 19, 19, 30, 48, 48, 48, 19, 19, 30, 48, 48, 48, 19, 19, 30, 48, 48, 48 .data # params length: .word 48 # array length (unused, auto-computed) xduree: .word 250 # facteur durée 100-1000 volume: .byte 60 # 0-127 transpo: .byte -12 # transposition note (octave == +-12) .text # $s0 array index # $s1 array length # $s4 duration scale # $s5 note tansposition main: lw $s4, xduree lb $s5, transpo # array length ->$s1 la $t6, syscalls la $t7, notes sub $s1, $t7, $t6 # play ... jal play addi $s5, $s5, -12 # octave -1 jal play addi $s5, $s5, +24 # octave +2 jal play # play forever j main #exit li $v0, 10 syscall play: li $s0, 0 #loop index loop: # note lb $v0, syscalls($s0) lb $a0, notes($s0) lb $a1, durees($s0) lb $a2, instrums($s0) lb $a3, volume # modifs add $a0, $a0, $s5 mult $a1, $s4 mflo $a1 # MIDI play syscall # loop/returns addi $s0, $s0, 1 bne $s0, $s1, loop jr $ra