Dup Goto 📝

ScaleMapper

PT2/music/reaper-jsfx jsfx 07-11 13:58:14
To Pop
252 lines, 926 words, 5238 chars Thursday 2024-07-11 13:58:14

This lets you transpose the white keys into an arbitary major or minor key. Press C# and a note to select a major key rooted on that note; D# and a note for a minor key; and F# toggles between major and minor.

desc: white key scale mapper jda

@init
function note(offset,channel,pitch,velocity) (
  ( velocity == 0 ) ? (
    midisend(offset, 0x80 | channel,pitch,0);
  ) : (
    midisend(offset, 0x90 | channel,pitch,velocity);
  );
);


function whitekey(offset,channel,pitch,velocity) (
  key1 = 1;
  pc = pitch % 12;   
  oct = floor(pitch / 12);
  ( select == 1 ) ? (
    ( isminor == 0 ) ? (
      root = pc;
      select = 0;
    ) : (
      root = (pc + 3) % 12;
      select = 0;
    );
  ) : (
    ( isminor == 1 ) ? (
      ( pc == 4 || pc == 9 || pc == 11 ) ? (
        pc -= 1;
      );
    );
    op = root + pc + (12*oct);
    note(offset,channel,op,velocity);
  )
);

function blackkey(offset,channel,pitch,velocity) (
  key1 = 2;
  pc = pitch % 12;   
  ( velocity > 0 ) ? (
    ( pc == 1 ) ? (
      select = 1;
      isminor = 0;
    ) : ( pc == 3 ) ? (
      select = 1;
      isminor = 1;
    ) : ( pc == 6 ) ? (
      isminor = 1 - isminor;
    );
  );
);


function key(offset,channel,pitch,velocity) (
  ( pitch == 21 ) ? (
    key1 = 3;
    ( velocity > 0 ) ? (
      bypass = 1 - bypass;
    )
  ) : ( bypass == 0 ) ? (
    key1 = 4;
    pc = pitch % 12;   
    oct = floor(pitch / 12);
    ( pc == 0 || pc == 2 || pc == 4 || pc == 5 || pc == 7 || pc == 9 || pc == 11 ) ? (
      whitekey(offset,channel,pitch,velocity);
    ) : (
      blackkey(offset,channel,pitch,velocity);
    );
  ) : (
    note(offset,channel,pitch,velocity);
  );
);

root = 0;
select = 0; // next key determines root == 1
isminor = 0; // major = 0, minor = 1
bypass = 0; // bypass > 0

@block
while(midirecv(offset,msg1,msg2,msg3)) (
  status = msg1 & 0xF0;
  channel = msg1 & 0x0F;
  (status == 0x90) ? (
    st = 1;
    key(offset,channel,msg2,msg3);
  ) : (status == 0x80) ? (
    st = 2;
    key(offset,channel,msg2,0);
  ) : (
    st = 3;
    midisend(offset,msg1,msg2,msg3);
  )
);

Scale Mapper 2

This one does one of four scales: major, natural minor, harmonic minor, ascending melodic minor. (The desceding melodic minor is the same as the natural/relative minor.)

desc: white key scale mapper 2 jda
// also does harmonic and melodic minors

@init
scale = 100;
scale_n = 0;

pc_to_degree = 12;
pc_to_degree[0] = 0;
pc_to_degree[1] = 0;
pc_to_degree[2] = 1;
pc_to_degree[3] = 0;
pc_to_degree[4] = 2;
pc_to_degree[5] = 3;
pc_to_degree[6] = 0;
pc_to_degree[7] = 4;
pc_to_degree[8] = 0;
pc_to_degree[9] = 5;
pc_to_degree[10] = 0;
pc_to_degree[11] = 6;

scale_base = 100; // major
scale_base[0] = 0;
scale_base[1] = 2;
scale_base[2] = 4;
scale_base[3] = 5;
scale_base[4] = 7;
scale_base[5] = 9;
scale_base[6] = 11;

scale_base = 200; // rel minor
scale_base[0] = 0;
scale_base[1] = 2;
scale_base[2] = 3;
scale_base[3] = 5;
scale_base[4] = 7;
scale_base[5] = 8;
scale_base[6] = 10;

scale_base = 300; // h minor
scale_base[0] = 0;
scale_base[1] = 2;
scale_base[2] = 3;
scale_base[3] = 5;
scale_base[4] = 7;
scale_base[5] = 8;
scale_base[6] = 11;

scale_base = 400; // asc m minor
scale_base[0] = 0;
scale_base[1] = 2;
scale_base[2] = 3;
scale_base[3] = 5;
scale_base[4] = 7;
scale_base[5] = 9;
scale_base[6] = 11;

function pc_in_scale(s,x) (
  scale[s*100+x];
); 

function note(offset,channel,pitch,velocity) (
  ( velocity == 0 ) ? (
    midisend(offset, 0x80 | channel,pitch,0);
  ) : (
    midisend(offset, 0x90 | channel,pitch,velocity);
  );
);


function whitekey(offset,channel,pitch,velocity) (
  key1 = 1;
  pc = pitch % 12;   
  ( select == 1 ) ? (
    root = pc;
    select = 0;
  ) : (
    deg = pc_to_degree[pc];
    oct = floor(pitch / 12);
    tt = scale_n;
    npitch = oct*12 + root + pc_in_scale(scale_n,deg);
    note(offset,channel,npitch,velocity);
  )
);

function blackkey(offset,channel,pitch,velocity) (
  key1 = 2;
  pc = pitch % 12;   
  ( velocity > 0 ) ? (
    ( pc == 1 ) ? (
      select = 1;
      scale_n = 0;
    ) : ( pc == 3 ) ? (
      select = 1;
      scale_n = 1;
    ) : ( pc == 6 ) ? (
      select = 1;
      scale_n = 2;
    ) : ( pc == 8 ) ? (
      select = 1;
      scale_n = 3;
    ) : ( pc == 10 ) ? (
      scale_n = (scale_n + 1) % 4;
    );
  );
);

function key(offset,channel,pitch,velocity) (
  ( pitch == 21 ) ? (
    key1 = 3;
    ( velocity > 0 ) ? (
      bypass = 1 - bypass;
    )
  ) : ( bypass == 0 ) ? (
    key1 = 4;
    pc = pitch % 12;   
    oct = floor(pitch / 12);
    ( pc == 0 || pc == 2 || pc == 4 || pc == 5 || pc == 7 || pc == 9 || pc == 11 ) ? (
      whitekey(offset,channel,pitch,velocity);
    ) : (
      blackkey(offset,channel,pitch,velocity);
    );
  ) : (
    note(offset,channel,pitch,velocity);
  );
);

root = 0;
select = 0; // next key determines root == 1
isminor = 0; // major = 0, minor = 1
bypass = 0; // bypass > 0

@block
while(midirecv(offset,msg1,msg2,msg3)) (
  status = msg1 & 0xF0;
  channel = msg1 & 0x0F;
  (status == 0x90) ? (
    st = 1;
    key(offset,channel,msg2,msg3);
  ) : (status == 0x80) ? (
    st = 2;
    key(offset,channel,msg2,0);
  ) : (
    st = 3;
    midisend(offset,msg1,msg2,msg3);
  )
);