After getting some dates for gigs with Betablocker DS, I am spending some time looking into audio algorithms, and implementing them on the Gameboy DS. Last Thursday I spent some time at the TAI studio/bunker with Till Bovermann investigating these PD patches by Claudius Maximus:
The algorithm uses feedback to create sounds that take some time to play through a wide range of frequencies. It works by writing into the same buffer it’s playing, but at a different rate/position – the resulting ugliness suits the style of BBDS very much. As an aid to our understanding Till converted the algorithm to Supercollider, then over the next couple of days I managed to get it running with an inner loop of 9 instructions on the DS (could probably be optimised further, but I’m still a beginner):
@ ---------------------------------------------------- @ qrz_maximus: *dst, length, readpos, writepos [freq, *tab] @ ---------------------------------------------------- .global qrz_maximus .type qrz_maximus, %function qrz_maximus: push {r4,r5,r6,r7} @ push the registers we need ldr r4, [r13,#20] @ load freq from stack into r4 ldr r5, [r13,#24] @ load *tab from stack into r5 ldr r6, .tablength @ load the tablen into r6 .maximus_loop: ldrh r7, [r5,r2] @ load the sample into r7 strh r7, [r0], #2 @ write output: *dst=r7 dst++ strh r7, [r5,r3] @ feedback into tab[writepos]=r7 add r2, r2, r4 @ readpos+=freq and r2, r2, r6 @ mask readpos into range add r3, r3, #2 @ writepos++ and r3, r3, r6 @ mask writepos into range subs r1, r1, #1 @ length-- bne .maximus_loop @ repeat until length zero mov r0, r2 @ return readpos pop {r4,r5,r6,r7} bx lr @ exit .tablength: .word 0x00003FF
And here it is running on autopilot with a test program in Betablocker:
Leave a Reply