Dup Ver Goto 📝

ScaleMapper

PT2/music/reaper-jsfx jsfx does not exist
To
252 lines, 926 words, 5238 chars Page 'ScaleMapper' does not exist.

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);
  )
);