fiddle_fluidsynth 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.standard.yml +3 -0
- data/CHANGELOG.md +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +138 -0
- data/Rakefile +14 -0
- data/examples/enum.rb +30 -0
- data/examples/example.sf2 +0 -0
- data/examples/ffs_arpeggio.rb +252 -0
- data/examples/ffs_example.rb +47 -0
- data/examples/ffs_fx.rb +200 -0
- data/examples/ffs_metronome.rb +260 -0
- data/examples/ffs_midiplay.rb +122 -0
- data/examples/ffs_simple.rb +45 -0
- data/examples/ffs_test1.rb +41 -0
- data/examples/ffs_test3.rb +50 -0
- data/examples/fiddle-pointer.rb +18 -0
- data/examples/presets-each.rb +66 -0
- data/examples/presets-full_scan.rb +59 -0
- data/examples/settings-each.rb +106 -0
- data/exe/ffs_midiplay.rb +122 -0
- data/lib/fiddle_fluidsynth/audio_output/driver.rb +104 -0
- data/lib/fiddle_fluidsynth/audio_output/file_renderer.rb +84 -0
- data/lib/fiddle_fluidsynth/audio_output.rb +7 -0
- data/lib/fiddle_fluidsynth/command_interface/command_interface.rb +90 -0
- data/lib/fiddle_fluidsynth/command_interface/handler.rb +95 -0
- data/lib/fiddle_fluidsynth/command_interface/server.rb +79 -0
- data/lib/fiddle_fluidsynth/command_interface/shell.rb +76 -0
- data/lib/fiddle_fluidsynth/command_interface.rb +9 -0
- data/lib/fiddle_fluidsynth/core_ext/fiddle.rb +142 -0
- data/lib/fiddle_fluidsynth/core_ext/module.rb +123 -0
- data/lib/fiddle_fluidsynth/fiddle_fluidsynth.rb +172 -0
- data/lib/fiddle_fluidsynth/logging/logging.rb +82 -0
- data/lib/fiddle_fluidsynth/logging.rb +6 -0
- data/lib/fiddle_fluidsynth/midi_input/driver.rb +77 -0
- data/lib/fiddle_fluidsynth/midi_input/events.rb +255 -0
- data/lib/fiddle_fluidsynth/midi_input/midi_input.rb +70 -0
- data/lib/fiddle_fluidsynth/midi_input/player.rb +289 -0
- data/lib/fiddle_fluidsynth/midi_input/router.rb +225 -0
- data/lib/fiddle_fluidsynth/midi_input.rb +11 -0
- data/lib/fiddle_fluidsynth/misc/misc.rb +162 -0
- data/lib/fiddle_fluidsynth/misc.rb +6 -0
- data/lib/fiddle_fluidsynth/sequencer/events.rb +679 -0
- data/lib/fiddle_fluidsynth/sequencer/sequencer.rb +384 -0
- data/lib/fiddle_fluidsynth/sequencer.rb +7 -0
- data/lib/fiddle_fluidsynth/settings/settings.rb +465 -0
- data/lib/fiddle_fluidsynth/settings.rb +6 -0
- data/lib/fiddle_fluidsynth/soundfonts/generators.rb +128 -0
- data/lib/fiddle_fluidsynth/soundfonts/loader.rb +506 -0
- data/lib/fiddle_fluidsynth/soundfonts/modulators.rb +247 -0
- data/lib/fiddle_fluidsynth/soundfonts/soundfonts.rb +64 -0
- data/lib/fiddle_fluidsynth/soundfonts/voices.rb +178 -0
- data/lib/fiddle_fluidsynth/soundfonts.rb +11 -0
- data/lib/fiddle_fluidsynth/synth/audio_rendering.rb +100 -0
- data/lib/fiddle_fluidsynth/synth/effect/chorus.rb +269 -0
- data/lib/fiddle_fluidsynth/synth/effect/iir_filter.rb +81 -0
- data/lib/fiddle_fluidsynth/synth/effect/ladspa.rb +172 -0
- data/lib/fiddle_fluidsynth/synth/effect/reverb.rb +207 -0
- data/lib/fiddle_fluidsynth/synth/effect.rb +10 -0
- data/lib/fiddle_fluidsynth/synth/midi/messages.rb +292 -0
- data/lib/fiddle_fluidsynth/synth/midi/setup.rb +235 -0
- data/lib/fiddle_fluidsynth/synth/midi/tuning.rb +128 -0
- data/lib/fiddle_fluidsynth/synth/midi.rb +9 -0
- data/lib/fiddle_fluidsynth/synth/params/params.rb +200 -0
- data/lib/fiddle_fluidsynth/synth/params.rb +8 -0
- data/lib/fiddle_fluidsynth/synth/soundfont_management.rb +210 -0
- data/lib/fiddle_fluidsynth/synth/synth.rb +114 -0
- data/lib/fiddle_fluidsynth/synth/voice_control.rb +94 -0
- data/lib/fiddle_fluidsynth/synth.rb +18 -0
- data/lib/fiddle_fluidsynth/types/types.rb +131 -0
- data/lib/fiddle_fluidsynth/types.rb +10 -0
- data/lib/fiddle_fluidsynth/util/callback.rb +585 -0
- data/lib/fiddle_fluidsynth/util/interface/settings.rb +689 -0
- data/lib/fiddle_fluidsynth/util/interface/soundfont.rb +115 -0
- data/lib/fiddle_fluidsynth/util/interface/soundfont_preset.rb +69 -0
- data/lib/fiddle_fluidsynth/util/interface/soundfont_sample.rb +61 -0
- data/lib/fiddle_fluidsynth/util/interface.rb +11 -0
- data/lib/fiddle_fluidsynth/util/module_hier.rb +403 -0
- data/lib/fiddle_fluidsynth/util/util.rb +467 -0
- data/lib/fiddle_fluidsynth/util-after.rb +12 -0
- data/lib/fiddle_fluidsynth/util.rb +37 -0
- data/lib/fiddle_fluidsynth/version.rb +10 -0
- data/lib/fiddle_fluidsynth.rb +57 -0
- data/sig/fiddle_fluidsynth.rbs +4 -0
- metadata +128 -0
@@ -0,0 +1,384 @@
|
|
1
|
+
#
|
2
|
+
# filename: fiddle-fluidstynth/sequencer/sequencer.rb
|
3
|
+
#
|
4
|
+
|
5
|
+
|
6
|
+
# References
|
7
|
+
# - fluidsynth.org, [API Reference](https://www.fluidsynth.org/api/modules.html)
|
8
|
+
#
|
9
|
+
class FiddleFluidSynth
|
10
|
+
|
11
|
+
# MIDI event sequencer.
|
12
|
+
# ==== References
|
13
|
+
# - API Reference, [MIDI Sequencer](https://www.fluidsynth.org/api/group__sequencer.html)
|
14
|
+
# - [library fiddle](https://docs.ruby-lang.org/ja/latest/library/fiddle.html)
|
15
|
+
#
|
16
|
+
|
17
|
+
|
18
|
+
#
|
19
|
+
module C
|
20
|
+
|
21
|
+
# Typedefs.
|
22
|
+
#
|
23
|
+
#
|
24
|
+
typealias 'fluid_event_callback_t', 'void*'
|
25
|
+
|
26
|
+
|
27
|
+
# Lifecycle Functions (MIDI Sequencer).
|
28
|
+
#
|
29
|
+
#
|
30
|
+
|
31
|
+
# Create a new sequencer object which uses the system timer.
|
32
|
+
extern 'fluid_sequencer_t* new_fluid_sequencer(void)'
|
33
|
+
|
34
|
+
# Create a new sequencer object.
|
35
|
+
extern 'fluid_sequencer_t* new_fluid_sequencer2(int)'
|
36
|
+
|
37
|
+
# Free a sequencer object.
|
38
|
+
extern 'void delete_fluid_sequencer(fluid_sequencer_t*)'
|
39
|
+
|
40
|
+
|
41
|
+
# Functions.
|
42
|
+
#
|
43
|
+
#
|
44
|
+
|
45
|
+
# Transforms an incoming MIDI event (from a MIDI driver or MIDI router)
|
46
|
+
# to a sequencer event and adds it to the sequencer queue for sending as
|
47
|
+
# soon as possible.
|
48
|
+
extern 'int fluid_sequencer_add_midi_event_to_buffer' +
|
49
|
+
'(void*, fluid_midi_event_t*)'
|
50
|
+
|
51
|
+
# Check if a client is a destination client.
|
52
|
+
extern 'int fluid_sequencer_client_is_dest(fluid_sequencer_t*, int)'
|
53
|
+
|
54
|
+
# Count a sequencers registered clients.
|
55
|
+
extern 'int fluid_sequencer_count_clients(fluid_sequencer_t*)'
|
56
|
+
|
57
|
+
# Get a client ID from its index (order in which it was registered).
|
58
|
+
#
|
59
|
+
extern 'fluid_seq_id_t fluid_sequencer_get_client_id' +
|
60
|
+
'(fluid_sequencer_t*, int)'
|
61
|
+
|
62
|
+
# Get the name of a registered client.
|
63
|
+
extern 'char* fluid_sequencer_get_client_name(void*, short)'
|
64
|
+
|
65
|
+
# Get the current tick of the sequencer scaled by the time scale
|
66
|
+
# currently set.
|
67
|
+
extern 'unsigned int fluid_sequencer_get_tick(fluid_sequencer_t*)'
|
68
|
+
|
69
|
+
# Get a sequencer's time scale.
|
70
|
+
extern 'double fluid_sequencer_get_time_scale(fluid_sequencer_t*)'
|
71
|
+
|
72
|
+
# Check if a sequencer is using the system timer or not.
|
73
|
+
extern 'int fluid_sequencer_get_use_system_timer(fluid_sequencer_t*)'
|
74
|
+
|
75
|
+
# Advance a sequencer.
|
76
|
+
extern 'void fluid_sequencer_process(fluid_sequencer_t*, unsigned int)'
|
77
|
+
|
78
|
+
# Register a sequencer client.
|
79
|
+
extern 'fluid_seq_id_t fluid_sequencer_register_client' +
|
80
|
+
'(fluid_sequencer_t*, char*, fluid_event_callback_t, void*)'
|
81
|
+
|
82
|
+
# Registers a synthesizer as a destination client of the given sequencer.
|
83
|
+
extern 'fluid_seq_id_t fluid_sequencer_register_fluidsynth' +
|
84
|
+
'(fluid_sequencer_t*, fluid_synth_t*)'
|
85
|
+
|
86
|
+
# Remove events from the event queue.
|
87
|
+
extern 'void fluid_sequencer_remove_events' +
|
88
|
+
'(fluid_sequencer_t*, fluid_seq_id_t, fluid_seq_id_t, int)'
|
89
|
+
|
90
|
+
# Schedule an event for sending at a later time.
|
91
|
+
extern 'int fluid_sequencer_send_at' +
|
92
|
+
'(fluid_sequencer_t*, fluid_event_t*, unsigned int, int)'
|
93
|
+
|
94
|
+
# Send an event immediately.
|
95
|
+
extern 'void fluid_sequencer_send_now(fluid_sequencer_t*, fluid_event_t*)'
|
96
|
+
|
97
|
+
# Set the time scale of a sequencer.
|
98
|
+
extern 'void fluid_sequencer_set_time_scale(fluid_sequencer_t*, double)'
|
99
|
+
|
100
|
+
# Unregister a previously registered client.
|
101
|
+
extern 'void fluid_sequencer_unregister_client' +
|
102
|
+
'(fluid_sequencer_t*, fluid_seq_id_t)'
|
103
|
+
|
104
|
+
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
#
|
110
|
+
#
|
111
|
+
#
|
112
|
+
class FiddleFluidSynth
|
113
|
+
module SequencerIF;
|
114
|
+
module InstanceOnlyIF; end
|
115
|
+
end
|
116
|
+
|
117
|
+
#
|
118
|
+
extend SequencerIF # for class methods.
|
119
|
+
include SequencerIF # for instance methods.
|
120
|
+
end
|
121
|
+
|
122
|
+
|
123
|
+
# Lifecycle Functions.
|
124
|
+
#
|
125
|
+
#
|
126
|
+
class FiddleFluidSynth
|
127
|
+
module SequencerIF
|
128
|
+
|
129
|
+
#
|
130
|
+
def sequencer_new()
|
131
|
+
deprecated_msg(__method__)
|
132
|
+
deprecated_msg_instead('sequencer_new2(0)', meth: __method__)
|
133
|
+
ret = C.new_fluid_sequencer()
|
134
|
+
if ret.nil? || ret.null?
|
135
|
+
ret = nil
|
136
|
+
else
|
137
|
+
ret.extend(InstanceOnlyIF)
|
138
|
+
end
|
139
|
+
ret
|
140
|
+
end
|
141
|
+
|
142
|
+
#
|
143
|
+
# ==== Args
|
144
|
+
# use_system_timer::
|
145
|
+
# If FALSE (0), call fluid_sequencer_process() to advance the sequencer
|
146
|
+
# and do NOT use the system timer.
|
147
|
+
# If TRUE, use the system timer (NOT recommended by the reference).
|
148
|
+
#
|
149
|
+
def sequencer_new2( use_system_timer = 0 )
|
150
|
+
ret = C.new_fluid_sequencer2(use_system_timer)
|
151
|
+
if ret.nil? || ret.null?
|
152
|
+
ret = nil
|
153
|
+
else
|
154
|
+
ret.extend(InstanceOnlyIF)
|
155
|
+
end
|
156
|
+
ret
|
157
|
+
end
|
158
|
+
|
159
|
+
def sequencer_delete( sequencer )
|
160
|
+
ret = C.delete_fluid_sequencer(sequencer)
|
161
|
+
ret
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
|
168
|
+
# Functions.
|
169
|
+
#
|
170
|
+
#
|
171
|
+
class FiddleFluidSynth
|
172
|
+
module SequencerIF
|
173
|
+
|
174
|
+
|
175
|
+
#
|
176
|
+
def sequencer_add_midi_event_to_buffer( data: , event: )
|
177
|
+
ret = C.fluid_sequencer_add_midi_event_to_buffer(data, event)
|
178
|
+
ret
|
179
|
+
end
|
180
|
+
|
181
|
+
#
|
182
|
+
def sequencer_client_is_dest( seq, seq_id: )
|
183
|
+
ret = C.fluid_sequencer_client_is_dest(seq, seq_id)
|
184
|
+
ret
|
185
|
+
end
|
186
|
+
|
187
|
+
### client-related.
|
188
|
+
|
189
|
+
def sequencer_count_clients( seq )
|
190
|
+
ret = C.fluid_sequencer_count_clients(seq)
|
191
|
+
ret
|
192
|
+
end
|
193
|
+
def sequencer_get_client_id( seq, index: )
|
194
|
+
ret = C.fluid_sequencer_get_client_id(seq, index)
|
195
|
+
ret
|
196
|
+
end
|
197
|
+
|
198
|
+
def sequencer_get_client_name( seq, seq_id: )
|
199
|
+
ret = C.fluid_sequencer_get_client_name(seq, seq_id)
|
200
|
+
if ret.nil? || ret.null?
|
201
|
+
ret = nil
|
202
|
+
else
|
203
|
+
ret = ret.to_s
|
204
|
+
end
|
205
|
+
ret
|
206
|
+
end
|
207
|
+
|
208
|
+
### .
|
209
|
+
def sequencer_get_tick( seq )
|
210
|
+
ret = C.fluid_sequencer_get_tick(seq)
|
211
|
+
ret
|
212
|
+
end
|
213
|
+
|
214
|
+
def sequencer_get_time_scale( seq )
|
215
|
+
ret = C.fluid_sequencer_get_time_scale(seq)
|
216
|
+
ret
|
217
|
+
end
|
218
|
+
|
219
|
+
#
|
220
|
+
def sequencer_get_use_system_timer( seq )
|
221
|
+
# deprecated_msg(__method__)
|
222
|
+
ret = C.fluid_sequencer_get_use_system_timer(seq)
|
223
|
+
ret
|
224
|
+
end
|
225
|
+
def sequencer_use_system_timer?( seq )
|
226
|
+
self.sequencer_get_use_system_timer(seq) != 0
|
227
|
+
end
|
228
|
+
def sequencer_nouse_system_timer?( seq )
|
229
|
+
!(self.sequencer_use_system_timer?(seq))
|
230
|
+
end
|
231
|
+
|
232
|
+
#
|
233
|
+
def sequencer_process( seq, msec: )
|
234
|
+
ret = C.fluid_sequencer_process(seq, msec)
|
235
|
+
ret
|
236
|
+
end
|
237
|
+
|
238
|
+
#
|
239
|
+
#
|
240
|
+
#
|
241
|
+
def sequencer_register_client( seq, name: , event_callback: , data: )
|
242
|
+
ret = C.fluid_sequencer_register_client(seq, name, event_callback, data)
|
243
|
+
ret
|
244
|
+
end
|
245
|
+
|
246
|
+
#
|
247
|
+
# def sequencer_register_fluidsynth( seq, synth: )
|
248
|
+
def sequencer_register_fluidsynth( seq, synth )
|
249
|
+
ret = C.fluid_sequencer_register_fluidsynth(seq, synth)
|
250
|
+
ret
|
251
|
+
end
|
252
|
+
|
253
|
+
def sequencer_remove_events( seq, src_seq_id: , dst_seq_id: , type: )
|
254
|
+
ret = C.fluid_sequencer_remove_events(seq, src_seq_id, dst_seq_id, type)
|
255
|
+
ret
|
256
|
+
end
|
257
|
+
|
258
|
+
#
|
259
|
+
def sequencer_send_at( seq, event: , time: , absolute: )
|
260
|
+
ret = C.fluid_sequencer_send_at(seq, event, time, absolute)
|
261
|
+
ret
|
262
|
+
end
|
263
|
+
|
264
|
+
def sequencer_send_now( seq, event: )
|
265
|
+
ret = C.fluid_sequencer_send_now(seq, event)
|
266
|
+
ret
|
267
|
+
end
|
268
|
+
|
269
|
+
#
|
270
|
+
def sequencer_set_time_scale( seq, scale: )
|
271
|
+
ret = C.fluid_sequencer_set_time_scale(seq, scale)
|
272
|
+
ret
|
273
|
+
end
|
274
|
+
|
275
|
+
def sequencer_unregister_client( seq, seq_id: )
|
276
|
+
ret = C.fluid_sequencer_unregister_client(seq, seq_id)
|
277
|
+
ret
|
278
|
+
end
|
279
|
+
|
280
|
+
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
|
285
|
+
#
|
286
|
+
#
|
287
|
+
#
|
288
|
+
class FiddleFluidSynth
|
289
|
+
module SequencerIF::InstanceOnlyIF
|
290
|
+
[
|
291
|
+
# add_midi_event_to_buffer().
|
292
|
+
|
293
|
+
### client info.
|
294
|
+
:client_is_dest,
|
295
|
+
:count_clients,
|
296
|
+
|
297
|
+
#
|
298
|
+
:get_client_id,
|
299
|
+
:get_client_name,
|
300
|
+
|
301
|
+
### client management.
|
302
|
+
:register_client,
|
303
|
+
:register_fluidsynth,
|
304
|
+
:unregister_client,
|
305
|
+
|
306
|
+
### sequencer event flow.
|
307
|
+
:send_at, :send_now,
|
308
|
+
:remove_events,
|
309
|
+
|
310
|
+
### sequencer behaviour.
|
311
|
+
:process,
|
312
|
+
:get_time_scale,
|
313
|
+
:set_time_scale,
|
314
|
+
|
315
|
+
### sequencer info.
|
316
|
+
:get_tick,
|
317
|
+
:get_use_system_timer,
|
318
|
+
|
319
|
+
].each do |_meth|
|
320
|
+
#
|
321
|
+
meth_name = _meth
|
322
|
+
call_name = 'sequencer_'+_meth.to_s
|
323
|
+
|
324
|
+
#
|
325
|
+
#ng. define_method(meth_name){| _self = self.itself, ... |
|
326
|
+
#ng. FFS.send(call_name, _self, ...)
|
327
|
+
define_method(meth_name){| *args, **kwargs |
|
328
|
+
FFS.send(call_name, self, *args, **kwargs)
|
329
|
+
}
|
330
|
+
end
|
331
|
+
|
332
|
+
|
333
|
+
### Aliases.
|
334
|
+
|
335
|
+
#{
|
336
|
+
# :is_dest? => :client_is_dest,
|
337
|
+
#}.each do |k, v|
|
338
|
+
#end
|
339
|
+
def is_dest?( ... )
|
340
|
+
tmp = self.client_is_dest(...)
|
341
|
+
ret = (tmp != 0)
|
342
|
+
ret
|
343
|
+
end
|
344
|
+
def client_id( ... )
|
345
|
+
tmp = self.get_client_id(...)
|
346
|
+
ret = tmp
|
347
|
+
ret
|
348
|
+
end
|
349
|
+
def client_name( ... )
|
350
|
+
tmp = self.get_client_name(...)
|
351
|
+
ret = tmp
|
352
|
+
ret
|
353
|
+
end
|
354
|
+
|
355
|
+
alias time_scale get_time_scale
|
356
|
+
def time_scale=( v )
|
357
|
+
tmp = self.set_time_scale(scale: v)
|
358
|
+
ret = tmp
|
359
|
+
ret
|
360
|
+
end
|
361
|
+
|
362
|
+
#
|
363
|
+
alias tick get_tick
|
364
|
+
|
365
|
+
#
|
366
|
+
alias use_system_timer get_use_system_timer
|
367
|
+
def use_system_timer?
|
368
|
+
ret = (self.get_use_system_timer != 0)
|
369
|
+
ret
|
370
|
+
end
|
371
|
+
|
372
|
+
def each_client_id( &blk )
|
373
|
+
cnt = self.count_clients
|
374
|
+
(0...cnt).each do |_i|
|
375
|
+
cid = self.get_client_id(index: _i)
|
376
|
+
blk.(cid)
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
|
384
|
+
#### endof filename: fiddle-fluidstynth/sequencer/sequencer.rb
|