Skip to content

Commit 032582f

Browse files
committed
Added a Single Octave MIDI Keyboard effect that mimics the way you play music in Guild Wars 2!
1 parent 5ad0f0b commit 032582f

File tree

1 file changed

+176
-0
lines changed

1 file changed

+176
-0
lines changed
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
desc:Pocram Single Octave MIDI Keyboard
2+
About:
3+
# About
4+
TODO describe me pls!!!1
5+
Link: https://github.com/Pocram93/JSFX
6+
Version: 0.1
7+
Author: Marco Picker
8+
Changelog:
9+
Initial release.
10+
11+
slider1:note_1_key_code=49<-1,255,1>Note 1 Key Code
12+
slider2:note_1_sharp_key_code=-1<-1,255,1>Note 1# Key Code
13+
slider3:note_2_key_code=50<-1,255,1>Note 2 Key Code
14+
slider4:note_2_sharp_key_code=-1<-1,255,1>Note 2# Key Code
15+
slider5:note_3_key_code=51<-1,255,1>Note 3 Key Code
16+
slider6:note_4_key_code=52<-1,255,1>Note 4 Key Code
17+
slider7:note_4_sharp_key_code=-1<-1,255,1>Note 4# Key Code
18+
slider8:note_5_key_code=53<-1,255,1>Note 5 Key Code
19+
slider9:note_5_sharp_key_code=-1<-1,255,1>Note 5# Key Code
20+
slider10:note_6_key_code=54<-1,255,1>Note 6 Key Code
21+
slider11:note_6_sharp_key_code=-1<-1,255,1>Note 6# Key Code
22+
slider12:note_7_key_code=55<-1,255,1>Note 7 Key Code
23+
slider13:note_8_key_code=56<-1,255,1>Note 8 Key Code
24+
25+
slider14:octave_down_key_code=57<-1,255,1>Octave Down Key Code
26+
slider15:octave_up_key_code=48<-1,255,1>Octave Up Key Code
27+
28+
slider17:current_octave_index=0<-5,5,1>Curent Octave
29+
30+
slider100:DEBUG_last_key=-1<-1,255,1>Last Pressed Key
31+
32+
@init
33+
octave_offset = 0;
34+
35+
octave_down_slider_id = 14;
36+
octave_up_slider_id = 15;
37+
38+
// Midi event enum
39+
midi_event_note_on = $x90;
40+
midi_event_note_off = $x80;
41+
42+
// Key state enum
43+
key_state_pressed = 3;
44+
key_state_held = 2;
45+
key_state_lifted = 1;
46+
key_state_not_pressed = 0;
47+
48+
note_map = 15;
49+
note_map[1] = 60;
50+
note_map[2] = 61;
51+
note_map[3] = 62;
52+
note_map[4] = 63;
53+
note_map[5] = 64;
54+
note_map[6] = 65;
55+
note_map[7] = 66;
56+
note_map[8] = 67;
57+
note_map[9] = 68;
58+
note_map[10] = 69;
59+
note_map[11] = 70;
60+
note_map[12] = 71;
61+
note_map[13] = 72;
62+
63+
key_states_array;
64+
65+
66+
@block
67+
// ------------------ FUNCTIONS ------------------ \\
68+
function update_current_octave()
69+
(
70+
previous_index = current_octave_index;
71+
72+
key_states_array[octave_up_slider_id] == key_state_pressed ?
73+
(
74+
current_octave_index = current_octave_index + 1;
75+
key_states_array[octave_up_slider_id] = key_state_lifted;
76+
);
77+
78+
key_states_array[octave_down_slider_id] == key_state_pressed ?
79+
(
80+
current_octave_index = current_octave_index - 1;
81+
key_states_array[octave_down_slider_id] = key_state_lifted;
82+
);
83+
84+
octave_offset = 12 * current_octave_index;
85+
86+
current_octave_index != previous_index;
87+
);
88+
89+
function send_note_events()
90+
(
91+
i = 1;
92+
loop(13,
93+
note_number = note_map[i] + octave_offset;
94+
95+
// Key pressed
96+
key_states_array[i] == key_state_pressed ?
97+
(
98+
midisend(0, midi_event_note_on, note_number, 127);
99+
key_states_array[i] = key_state_held;
100+
);
101+
102+
key_states_array[i] == key_state_lifted ?
103+
(
104+
midisend(0, midi_event_note_off, note_number, 127);
105+
key_states_array[i] = key_state_not_pressed;
106+
);
107+
108+
i = i + 1;
109+
);
110+
);
111+
112+
function send_midi_off_for_octave(octave)
113+
(
114+
i = 1;
115+
loop(13,
116+
note_number = note_map[i] + octave * 12;
117+
118+
// Is key bound?
119+
slider(i) > 0 ?
120+
(
121+
midisend(0, midi_event_note_off, note_number, 127);
122+
);
123+
124+
i = i + 1;
125+
);
126+
);
127+
128+
// ------------------ LOGIC ------------------ \\
129+
previous_octave = current_octave_index;
130+
octave_changed = update_current_octave();
131+
octave_changed ? send_midi_off_for_octave(previous_octave);
132+
133+
send_note_events();
134+
135+
@gfx
136+
// ------------------ STATICS ------------------ \\
137+
function update_key_states()
138+
(
139+
note_i = 1;
140+
loop(15,
141+
slider(note_i) > 0 ?
142+
(
143+
is_key_down = gfx_getchar(slider(note_i));
144+
previous_state = key_states_array[note_i];
145+
146+
// Key down
147+
// Keys can only be pressed when they are not currently being pressed!
148+
is_key_down && previous_state == key_state_not_pressed ?
149+
(
150+
key_states_array[note_i] = key_state_pressed;
151+
);
152+
153+
// Key lifted
154+
is_key_down < 1 && (previous_state == key_state_pressed || previous_state == key_state_held) ?
155+
(
156+
key_states_array[note_i] = key_state_lifted;
157+
);
158+
159+
// Key not pressed
160+
is_key_down < 1 && (previous_state == key_state_lifted) ?
161+
(
162+
key_states_array[note_i] = key_state_not_pressed;
163+
);
164+
);
165+
166+
note_i = note_i + 1;
167+
);
168+
);
169+
170+
// ----------------- RENDERING------------------ \\
171+
gfx_clear = 0;
172+
173+
update_key_states();
174+
175+
char = gfx_getchar();
176+
char > 0 ? DEBUG_last_key = char;

0 commit comments

Comments
 (0)