The first Model 100 project I planned to tackle was to have my ancient laptop produce some sweet tunes. You know, something along a Red Means Recording creation, but with a 34 year old(!) laptop. Mind you, I've got no experience actually creating music, but I figured that would hardly get in my way. What can I say, programmers are optimists.
While I could get the Model 100 to beep with relative ease, getting it produce anything along the lines of a tune was considerably more tricky. And then there's the hell that is line number BASIC. Besides the obvious annoyance of line numbers, you've got no named functions and only 1 and 2 character global variables to at your disposal. And of course, the Model 100 has an 8 line screen, which is another obstacle to deal with. Still, trying to create order out of such programming chaos was surprisingly fun, so I stuck with it.
For my musical creation, I give you a simple application which will play the notes of your choice. You can even control the octave and duration of the notes with relative ease (global variables for the win).
And here's my very first tune, carefully transcribed from an Internet resource.
Can you name that tune?
As I mentioned above, this exercise had less to do with creating interesting music and more to do with developing a sort of coding style that made reasoning on the Model 100 a doable task. For my tiny little program, I got there. Check out the code that powers the above song:
10 REM more music 20 REM Song: Yankee Doodle 30 DATA "C","C","D","E","C","E","D" 31 DATA "C","C","D","E","C","B" 32 DATA "C","C","D","E","F","E","D" 33 DATA "C","B","G","A","B","C","C" 39 DATA "X" 40 LET D = 7 50 FOR O = 1 TO 5 STEP 1 60 GOSUB 1000 70 RESTORE 30 80 NEXT O 99 END 1000 REM iterate through notes 1010 READ N$ 1020 IF N$ = "X" THEN GOTO 1999 1030 GOSUB 2000 1040 GOTO 1010 1999 RETURN 2000 REM Let's Play the note in n$ 2010 FQ(1) = 698 2020 FQ(2) = 622 2030 FQ(3) = 587 2040 FQ(4) = 523 2050 FQ(5) = 466 2060 FQ(6) = 439 2070 FQ(7) = 783 2080 I = ASC(N$) - 64 2090 F = FQ(I) 2100 FOR S = 1 TO O-1 STEP 1 2110 F = F * 2 2120 NEXT S 2130 PRINT "playing "; N$ ; F ; I 2140 SOUND F, D 2999 RETURN
There's actually quite a few 'features' in the above code, including: support for playing arbitrary length songs, the ability to code in simple music notation ("C" for a C note) and as I bragged about above, the ability to control the duration and octave of each note. Heck, thanks to GOSUB I even achieved something resembling modularity.
I'm not quite sure where I go from here. I suppose I could continue this musical journey and see if I can't eek out something resembling unique (and perhaps even pleasant?!) music from this device. Or maybe it's time to find a new challenge.
This was a fascinating exercise in programming deprivation. Trying to hack my way out of line numbers and global variables was a great way to see classic programming challenges in a new light.
No comments:
Post a Comment