Jump to content
IGNORED

Algorithm to Convert ASCII Binary 0-255 to Specified Values for the 1s


Recommended Posts

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 by UNIXcoffee928
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 by cas
Link to comment
Share on other sites

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 by UNIXcoffee928
Link to comment
Share on other sites

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.

 

post-7682-1205553596_thumb.jpg

Link to comment
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...