UNIXcoffee928 Posted March 12, 2008 Share Posted March 12, 2008 (edited) I'm considering a few methods of doing this, input from others is appreciated, before I get wrapped up in it. Summary: I want to create a MIDI drum pattern library that I can easily manipulate algorithmically. All patterns of sequenced eighth notes can be easily represented via the ASCII representation of the binary equivalent of 0-255 (as note on or off patterns). So, it would operate on a txt file like this: 00000000 00000001 00000010 00000011 00000100 00000101 00000110 00000111 00001000 00001001 00001010 00001011 00001100 00001101 00001110 00001111 00010000 00010001 00010010 00010011 00010100 00010101 00010110 00010111 00011000 00011001 00011010 00011011 00011100 00011101 00011110 00011111 00100000 00100001 00100010 00100011 00100100 00100101 00100110 00100111 00101000 00101001 00101010 00101011 00101100 00101101 00101110 00101111 00110000 00110001 00110010 00110011 00110100 00110101 00110110 00110111 00111000 00111001 00111010 00111011 00111100 00111101 00111110 00111111 01000000 01000001 01000010 01000011 01000100 01000101 01000110 01000111 01001000 01001001 01001010 01001011 01001100 01001101 01001110 01001111 01010000 01010001 01010010 01010011 01010100 01010101 01010110 01010111 01011000 01011001 01011010 01011011 01011100 01011101 01011110 01011111 01100000 01100001 01100010 01100011 01100100 01100101 01100110 01100111 01101000 01101001 01101010 01101011 01101100 01101101 01101110 01101111 01110000 01110001 01110010 01110011 01110100 01110101 01110110 01110111 01111000 01111001 01111010 01111011 01111100 01111101 01111110 01111111 10000000 10000001 10000010 10000011 10000100 10000101 10000110 10000111 10001000 10001001 10001010 10001011 10001100 10001101 10001110 10001111 10010000 10010001 10010010 10010011 10010100 10010101 10010110 10010111 10011000 10011001 10011010 10011011 10011100 10011101 10011110 10011111 10100000 10100001 10100010 10100011 10100100 10100101 10100110 10100111 10101000 10101001 10101010 10101011 10101100 10101101 10101110 10101111 10110000 10110001 10110010 10110011 10110100 10110101 10110110 10110111 10111000 10111001 10111010 10111011 10111100 10111101 10111110 10111111 11000000 11000001 11000010 11000011 11000100 11000101 11000110 11000111 11001000 11001001 11001010 11001011 11001100 11001101 11001110 11001111 11010000 11010001 11010010 11010011 11010100 11010101 11010110 11010111 11011000 11011001 11011010 11011011 11011100 11011101 11011110 11011111 11100000 11100001 11100010 11100011 11100100 11100101 11100110 11100111 11101000 11101001 11101010 11101011 11101100 11101101 11101110 11101111 11110000 11110001 11110010 11110011 11110100 11110101 11110110 11110111 11111000 11111001 11111010 11111011 11111100 11111101 11111110 11111111 I would like to be able to specify the values that the pattern will play, then generate a file of all possible combinations. So, zero will be equivalent to no drum note playing, and one will be replaced by the MIDI note value of the drum to be played. For example, one could be assigned to a closed hi-hat, or a bass drum, or a snare drum, etc. I'll deal with other parameters, such as velocity, pan, & such, once it's working. Bear in mind that MIDI files are not txt files, there will be a further conversion. This is just one step in the process of generating a drum pattern database. Once the main algorithm is decided upon, it will allow the 0-255 to be concatenated with another list of 0-255 to provide 16th note resolution. Ultimately, the program will allow for a specified # of different drum notes at run time, and will generate all possible drum patterns, with those instruments. An example of this would be 0-255 for Bass, Snare, Hi-hat closed & open, & so forth, generated automatically, then converted into a suitable MIDI file that Fruity Loops can display as separate 16th note patterns. This will be the basis of building a drum pattern database for use in another sequencer. So, before I get wrapped up in following a path that may be inefficient, perhaps some others here can help me get this to a point where it will be very efficient. Any language, or method is acceptable here. Whatever means, as long as it generates a txt file of all of the correct values, for further manipulation. Ideas on this? Edited March 12, 2008 by UNIXcoffee928 Quote Link to comment Share on other sites More sharing options...
Rybags Posted March 12, 2008 Share Posted March 12, 2008 In BASIC, where BYTE is each decimal byte value: HI=INT(BYTE/16) LOW=BYTE-HIGH*16 HINYBBLE$=BINARY$(HI*4+1) LOWNYBBLE$=BINARY$(LOW*4+1) Have BINARY$ a string of length 64 containing the text "0000 0001 0010 0011" etc (without spaces). In Assembler, it's a bit easier. Just a loop with LSR BYTE, then output a 0 or 1 to the text file depending on the Carry status. Quote Link to comment Share on other sites More sharing options...
kenfused Posted March 12, 2008 Share Posted March 12, 2008 In straight Atari BASIC 10 DIM RESULT$( 11 PRINT "ENTER NUM TO CONVERT TO BIN"; 12 INPUT NUM 15 D=128: FOR I=1 TO 8: DIGIT=INT(NUM/D) : NUM=NUM-DIGIT*D : RESULT$(I) = STR$(DIGIT) : D=D/2 : NEXT I 70 PRINT RESULT$ Quote Link to comment Share on other sites More sharing options...
cas Posted March 12, 2008 Share Posted March 12, 2008 (edited) In Forth, you can just change the base for numerical output to 2 (binary) and every output command will automatically print out binary values ( definition of .BINARY -- aka print binary ) : .BINARY ( n -- ) BASE @ \ store old base value on stack 2 BASE ! \ switch to binary utput SWAP \ swap value to print and old base U. \ print value without sign BASE ! \ restore old base ; to use this new definition: 15 .binary 1111 ok 20 .binary 10100 ok 8 .binary 1000 ok hex ok ff .binary 11111111 ok Edited March 12, 2008 by cas Quote Link to comment Share on other sites More sharing options...
UNIXcoffee928 Posted March 13, 2008 Author Share Posted March 13, 2008 (edited) Thanks for the prompt response, but let me clarify the nature of the problem to be solved... We aren't dealing with the binary values. The full list of binary #s 0-255 exists as a text file, as pasted above in the codebox. What we are dealing with is the pattern of 1s & zeros. We want to keep it text, and assign a specific decimal value as a replacement for all 1s that occur. So, if the replace variable is DEC 27, and the pattern is 10001000, we would end up with output like: [27 0 0 0 27 0 0 0] if it's 120 DEC we get: [120 0 0 0 120 0 0 0] & so forth. Think of it like this, if 120 DEC is a bass drum (BD) 10001000 will play like: BD * * * BD * * * where the * character represents blank metronome ticks. which sounds like: THUMP SILENCE SILENCE SILENCE THUMP SILENCE SILENCE SILENCE Basically, a drumbeat. So, this is more like a search & replace operation based on pattern matching, operating on a text file containing the binary patterns of 0-255. This part of the program should basically be able to substitute the decimal values of 0-127 (the MIDI patch numbers) for the ones in each binary pattern, incrementing in a loop, doing the substitution for patch zero, writing the file, doing the substitution for patch 1, writing the file, the substitution for patch 3, writing the file, ans so on, until patch 127 is written. It would write separate text files to a directory as a single database record, with a filename like 120-BD_10001000, incrementing the filename appropriately. This way it would be easy to see the pattern being worked on, just by viewing the filename. Once all of the records have been written, substituting the binary pattern ones with the decimal range [0-127] there would be separate directories filled with all possible combinations of drum patterns for each drum instrument. (128 directories filled with all possible combinations of beat & silence. Then a tool to recursively go through the directories & convert the patterns to short MIDI files would be applied. The end result would import these midi files into a drum sequence database, allowing the user to insert any pattern into a sequencer. The goal is to have the computer do the work, and create a full library of all possible patterns with all possible drum sounds, which can easily be inserted into a composition without didilying around with time wasting drum pattern creation for each measure. Thanks again. Edited March 13, 2008 by UNIXcoffee928 Quote Link to comment Share on other sites More sharing options...
UNIXcoffee928 Posted March 15, 2008 Author Share Posted March 15, 2008 Doing it in TCL/TK with regular expressions. Pic of an early beta attached, starting to look spiffy. I'll keep you posted on the progress. Feel free to talk about optimization techniques. Once it's fully functional for it's intended purpose, I'll add some Atari-specific uses for it, since, for the most part, it is a generalized byte twiddler. Should be a nice tool when it's done. Thanks for your suggestions. L8R. Quote Link to comment Share on other sites More sharing options...
UNIXcoffee928 Posted March 16, 2008 Author Share Posted March 16, 2008 Been hacking at this a bit today, developing some interesting GUI metaphors to streamline it's use. See pic. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.