$title Choose Notes for melodic Lines and Chords with Permutations (PMELODY,SEQ=375)
$onText
Having all permuations of a set can be handy.
There is one cute application by Julius Davies to write music:
"
One of my clients is a composer of music (Andre Cormier), and he
asked me to write a permutation calculator to help him choose notes
for melodic lines and chords.
"
In this model we use explicit GAMS syntax to generate permuations of
numbers and produce a similar output. Note, that we don't eliminate
duplicate permutations.
Keywords: GAMS language features, generating permutations, musical composition
$offText
Set
n 'pitch classes' / C, 'C#', D, 'D#', E, F, 'F#', G, 'G#', A, 'A#', B /
ni(n) 'initial note' / C /
i 'semitone jumps' / i1*i4 /;
$eval pmax fact(card(i))
Set p 'permuation index' / p1*p%pmax% /;
Parameter
$onEps
j(i) 'actual seminote jumps' / i1 1, i2 1, i3 0, i4 5 /
$offEps
m(p,i) 'permutation of jumps'
mm(p,i) 'accumulated jumps';
option m > j;
mm(p,i) = 0;
loop(i, mm(p,i) = mm(p,i-1) + m(p,i));
Set np(p,i,n) 'note at ith jump';
loop(ni(n), np(p,i,n + mm(p,i)) = yes);
option np:1:1:1;
display np;
File f / perm.txt /;
put f '* Permutation of semitone jumps';
loop(p,
put / 'C ';
loop(np(p,i,n), put n.tl:3:0;);
loop(i, put m(p,i):2:0);
);