Difference between revisions of "SLOrk/Instruments/KoolKeys"
(→Chord isolation) |
|||
Line 57: | Line 57: | ||
[SHIFT] + [1] to select lowest note <br> | [SHIFT] + [1] to select lowest note <br> | ||
− | [SHIFT] + [ | + | [SHIFT] + [2] to select medium low note <br> |
− | [SHIFT] + [ | + | [SHIFT] + [3] to select medium high note <br> |
− | [SHIFT] + [ | + | [SHIFT] + [4] to select highest note <br> |
− | [SHIFT] + [ | + | [SHIFT] + [5] to select all of chord. |
− | + | ||
== Advanced users == | == Advanced users == |
Revision as of 09:40, 20 May 2009
Contents
Description
The program senses mouse movement, and plays chords (each note of the chord on a different channel) at the volume which cooresponds to the speed of the mouse movement. It can be modified to play through a Hemi or through laptop speakers.
Usage
Installation
- Copy the file koolkeys.ck to any folder you like
Executing
- Using a terminal go to the folder where "koolkeys.ck" is located
- On the terminal window type: (replace N with the number of output channels of the audio card)
chuck -cN koolkeys.ck
- Play!
Execution
This program works much like a keyboard on a piano, and is highly based off of the virtual keyboard in Garage Band.
- Select the root note by using 2nd and 3rd rows of the keyboard (from A & W to P & '). See root note selection for details
- Play chord by moving finger over trackpad
- Optional:
- Select number of pings to play by using numbers 1 through 9 (number of pings will be double the selected value)
- Adjust chord type
- Change register
- Change tempo of pings
- Isolate individual notes of chord
Key mapping
Root note selection
C | C# | D | D# | E | F | F# | G | G# | A | A# | B | C | C# | D | D# | D | E | F |
A | W | S | E | D | F | T | G | Y | H | U | J | I | K | O | L | P | ; |
Chord selection
Major | Minor | Dominant 7 | Minor 7 | Power | Sixth | Major 7 | Sustained 4 | Diminished |
Z | X | C | V | B | N | M | , |
Register selection
[+] to Increase by 1 octave ([=] will suffice).
[-] to Decrease by 1 octave.
Ping tempo
[[] to decrease ping tempo by 5 bpm.
[]] to increase ping tempo by 5 bpm.
Chord isolation
[SHIFT] + [1] to select lowest note
[SHIFT] + [2] to select medium low note
[SHIFT] + [3] to select medium high note
[SHIFT] + [4] to select highest note
[SHIFT] + [5] to select all of chord.
Advanced users
ChucK Code
If you just want to look at the code, here it is:
//KoolKeys 2 => int speakers; 60 => int key; 0 => int chance_high; 0 => int player; 240 => float tempo; SinOsc frst => JCRev r => dac.chan(0%speakers); SinOsc thrd => r => dac.chan(1%speakers); SinOsc fith => r => dac.chan(2%speakers); SinOsc sevn => r => dac.chan(3%speakers); SinOsc high => r => Echo a; [0,4,7,12] @=> int maj[]; [0,3,7,12] @=> int min[]; [0,4,7,10] @=> int dom7[]; [0,3,7,10] @=> int min7[]; [0,7,12,0] @=> int pwr[]; [0,4,7,9] @=> int six[]; [0,4,7,11] @=> int maj7[]; [0,5,7,12] @=> int sus4[]; [0,4,7,14] @=> int nin[]; [0,2,7,12] @=> int sec[]; [0,3,6,9] @=> int dim7[]; [-1,3,6,11] @=> int flat7[]; KBHit kb; //keyboard Hid hi; HidMsg msg; 0=>float volume; 0=>float true_vol; if( !hi.openMouse( 0 ) ) me.exit(); int k; maj @=> int chord[]; 0 => int deg; 0 => int octave; float play_now[]; function float[] chnum(int start, int deg, int chord[]) { return [Std.mtof(start+deg+octave+chord[4%4]),Std.mtof(start+deg+octave+chord[5%4]),Std.mtof(start+deg+octave+chord[6%4]),Std.mtof(start+deg+octave+chord[7%4])]; } function void get_mouse() { while (true) { hi => now; while (hi.recv( msg )) { if( msg.isMouseMotion() ) { Math.abs(msg.deltaX)+Math.abs(msg.deltaY)+volume=>volume; } } } } function void main_loop() { while (true) { volume*.85 => volume; volume => true_vol; true_vol/4500.0 => true_vol; if (true_vol>1.0) {1.0=>true_vol;} if (true_vol<.001) {0.0=>true_vol;} kb.getchar() => k; //<<<k>>>; if (k>=48&k<=57) {(k-48)*2 => chance_high;<<<(k-48)*2," pings">>>;} if (k==122) {maj@=>chord;<<<"Major","">>>;} if (k==120) {min@=>chord;<<<"Minor","">>>;} if (k==99) {dom7@=>chord;<<<"Dominant 7","">>>;} if (k==118) {min7@=>chord;<<<"Minor 7","">>>;} if (k==98) {pwr@=>chord;<<<"Power","">>>;} if (k==110) {six@=>chord;<<<"Sixth","">>>;} if (k==109) {maj7@=>chord;<<<"Major 7","">>>;} if (k==44) {sus4@=>chord;<<<"Sustained 4","">>>;} if (k==46) {nin@=>chord;<<<"Ninth","">>>;} if (k==47) {dim7@=>chord;<<<"Diminshed 7","">>>;} if (k==97) {0=>deg;<<<"C","">>>;} if (k==119) {1=>deg;<<<"C#","">>>;} if (k==115) {2=>deg;<<<"D","">>>;} if (k==101) {3=>deg;<<<"D#","">>>;} if (k==100) {4=>deg;<<<"E","">>>;} if (k==102) {5=>deg;<<<"F","">>>;} if (k==116) {6=>deg;<<<"F#","">>>;} if (k==103) {7=>deg;<<<"G","">>>;} if (k==121) {8=>deg;<<<"G#","">>>;} if (k==104) {9=>deg;<<<"A","">>>;} if (k==117) {10=>deg;<<<"A#","">>>;} if (k==106) {11=>deg;<<<"B","">>>;} if (k==107) {12=>deg;<<<"C","">>>;} if (k==111) {13=>deg;<<<"C#","">>>;} if (k==108) {14=>deg;<<<"D","">>>;} if (k==112) {15=>deg;<<<"D#","">>>;} if (k==59) {16=>deg;<<<"E","">>>;} if (k==39) {17=>deg;<<<"F","">>>;} if (k == 45) {12 -=> octave;<<<"Octave:",octave/12>>>;} if (k == 61) {12 +=> octave;<<<"Octave:",octave/12>>>;} if (k == 91) {5 -=> tempo;<<<tempo,"bpm">>>;} if (k == 93) {5 +=> tempo;<<<tempo,"bpm">>>;} if (k == 33) {1 => player;<<<"Base","">>>;} if (k == 64) {2 => player;<<<"Tenor","">>>;} if (k == 35) {3 => player;<<<"Alto","">>>;} if (k == 36) {4 => player;<<<"Soprano","">>>;} if (k == 37) {0 => player;<<<"All","">>>;} //<<<player>>>; chnum(key,deg,chord) @=> play_now; true_vol/5.0=>true_vol; //<<<true_vol>>>; if (player == 1) {true_vol => frst.gain;0 => thrd.gain;0 => fith.gain;0 => sevn.gain;} if (player == 2) {true_vol => thrd.gain;0 => frst.gain;0 => fith.gain;0 => sevn.gain;} if (player == 3) {true_vol => fith.gain;0 => frst.gain;0 => thrd.gain;0 => sevn.gain;} if (player == 4) {true_vol => sevn.gain;0 => frst.gain;0 => thrd.gain;0 => fith.gain;} if (player == 0) {true_vol => frst.gain;true_vol => thrd.gain;true_vol => fith.gain;true_vol => sevn.gain;} play_now[0] => frst.freq; play_now[1] => thrd.freq; play_now[2] => fith.freq; play_now[3] => sevn.freq; 100::ms => now; } } function void pings(){ while(true){ for (0 => int i; i < chance_high; i++) { .05-true_vol/2 => high.gain; a => dac.chan(Std.rand2(0,speakers - 1)); Std.mtof(chord[Std.rand2(0,3)]+key+deg+Std.rand2(0,1)*12) => high.freq; (60000/tempo)::ms => now; } 0.0 => high.gain; a =< dac; 0 => chance_high; 100::ms => now; } } spork ~ get_mouse(); spork ~ main_loop(); spork ~ pings(); while (true) { 100::ms=>now; }
-w