// Lars Kindermann's algorithm (http://www.reglos.de/musinum/)
// Author: Peter Sovietov

desc:Simple algorithmic music generator
slider1:33<1,30000,1>song number
slider2:0.5<0.1,4>note duration (beats)
slider3:0<0,3,1{Major,Natural minor,Melodic minor,Harmonic minor,Pentatonic,Blues}>scale
slider4:48<0,127,1<0,127,1{0: C-1,1: C#/Db-1,2: D-1,3: D#/Eb-1,4: E-1,5: F-1,6: F#/Gb-1,7: G-1,8: G#/Ab-1,9: A-1,10: A#/Bb-1,11: B-1,12: C0,13: C#/Db0,14: D0,15: D#/Eb0,16: E0,17: F0,18: F#/Gb0,19: G0,20: G#/Ab0,21: A0,22: A#/Bb0,23: B0,24: C1,25: C#/Db1,26: D1,27: D#/Eb1,28: E1,29: F1,30: F#/Gb1,31: G1,32: G#/Ab1,33: A1,34: A#/Bb1,35: B1,36: C2,37: C#/Db2,38: D2,39: D#/Eb2,40: E2,41: F2,42: F#/Gb2,43: G2,44: G#/Ab2,45: A2,46: A#/Bb2,47: B2,48: C3,49: C#/Db3,50: D3,51: D#/Eb3,52: E3,53: F3,54: F#/Gb3,55: G3,56: G#/Ab3,57: A3,58: A#/Bb3,59: B3,60: C4,61: C#/Db4,62: D4,63: D#/Eb4,64: E4,65: F4,66: F#/Gb4,67: G4,68: G#/Ab4,69: A4,70: A#/Bb4,71: B4,72: C5,73: C#/Db5,74: D5,75: D#/Eb5,76: E5,77: F5,78: F#/Gb5,79: G5,80: G#/Ab5,81: A5,82: A#/Bb5,83: B5,84: C6,85: C#/Db6,86: D6,87: D#/Eb6,88: E6,89: F6,90: F#/Gb6,91: G6,92: G#/Ab6,93: A6,94: A#/Bb6,95: B6,96: C7,97: C#/Db7,98: D7,99: D#/Eb7,100: E7,101: F7,102: F#/Gb7,103: G7,104: G#/Ab7,105: A7,106: A#/Bb7,107: B7,108: C8,109: C#/Db8,110: D8,111: D#/Eb8,112: E8,113: F8,114: F#/Gb8,115: G8,116: G#/Ab8,117: A8,118: A#/Bb8,119: B8,120: C9,121: C#/Db9,122: D9,123: D#/Eb9,124: E9,125: F9,126: F#/Gb9,127: G9}>low note
@init
time_counter = 0;
musinum_counter = 0;
note_number = -1;
major = 0;
major[0] = 0;
major[1] = 2;
major[2] = 4;
major[3] = 5;
major[4] = 7;
major[5] = 9;
major[6] = 11;
natural_minor = major + 7;
natural_minor[0] = 0;
natural_minor[1] = 2;
natural_minor[2] = 3;
natural_minor[3] = 5;
natural_minor[4] = 7;
natural_minor[5] = 8;
natural_minor[6] = 10;
melodic_minor = natural_minor + 7;
melodic_minor[0] = 0;
melodic_minor[1] = 2;
melodic_minor[2] = 3;
melodic_minor[3] = 5;
melodic_minor[4] = 7;
melodic_minor[5] = 9;
melodic_minor[6] = 11;
harmonic_minor = melodic_minor + 7;
harmonic_minor[0] = 0;
harmonic_minor[1] = 2;
harmonic_minor[2] = 3;
harmonic_minor[3] = 5;
harmonic_minor[4] = 7;
harmonic_minor[5] = 8;
harmonic_minor[6] = 11;
pentatonic = harmonic_minor + 7;
pentatonic[0] = 0;
pentatonic[1] = 2;
pentatonic[2] = 4;
pentatonic[3] = 7;
pentatonic[4] = 9;
blues = pentatonic + 5;
blues[0] = 0;
blues[1] = 3;
blues[2] = 5;
blues[3] = 6;
blues[4] = 7;
blues[5] = 10;
scales = blues + 6;
scales[0] = major;
scales[1] = natural_minor;
scales[2] = melodic_minor;
scales[3] = harmonic_minor;
scales[4] = pentatonic;
scales[5] = blues;
scales_length = scales + 6;
scales_length[0] = 7;
scales_length[1] = 7;
scales_length[2] = 7;
scales_length[3] = 7;
scales_length[4] = 5;
scales_length[5] = 6;
notes = scales_length + 6;
@slider
(
  i = 0;
  (i < 32) ? (
    while(
      notes[i] = min(slider4 + (((i / (scales_length[slider3])) | 0) * 12) + ((scales[slider3])[i % (scales_length[slider3])]), 127);
      i += 1;
      i < 32;
    );
  );
);
@block
time_counter -= samplesblock;
(time_counter < 0) ? (
  (note_number >= 0) ? (
    midisend(time_counter + samplesblock, 144, note_number);
  );
  new_note_number = (
    (slider1 != musinum_multiple) ? (
      musinum_counter = 0;
    );
    musinum_multiple = slider1;
    musinum_bits = (
      count_bits_n = musinum_counter;
      count_bits_c = 0;
      (count_bits_n) ? (
        while(
          count_bits_n &= count_bits_n - 1;
          count_bits_c += 1;
          count_bits_n;
        );
      );
      count_bits_c;
    );
    musinum_counter += musinum_multiple;
    musinum_counter &= 4294967295;
    notes[musinum_bits];
  );
  (new_note_number != note_number) ? (
    note_number = new_note_number;
    midisend(time_counter + samplesblock, 144, note_number | 32512);
  ) : (
    note_number = -1;
  );
  time_counter += max((
    (1 / (tempo / 60)) * slider2 * srate;
  ), samplesblock);
);
