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.
Files changed (85) hide show
  1. checksums.yaml +7 -0
  2. data/.standard.yml +3 -0
  3. data/CHANGELOG.md +5 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +138 -0
  6. data/Rakefile +14 -0
  7. data/examples/enum.rb +30 -0
  8. data/examples/example.sf2 +0 -0
  9. data/examples/ffs_arpeggio.rb +252 -0
  10. data/examples/ffs_example.rb +47 -0
  11. data/examples/ffs_fx.rb +200 -0
  12. data/examples/ffs_metronome.rb +260 -0
  13. data/examples/ffs_midiplay.rb +122 -0
  14. data/examples/ffs_simple.rb +45 -0
  15. data/examples/ffs_test1.rb +41 -0
  16. data/examples/ffs_test3.rb +50 -0
  17. data/examples/fiddle-pointer.rb +18 -0
  18. data/examples/presets-each.rb +66 -0
  19. data/examples/presets-full_scan.rb +59 -0
  20. data/examples/settings-each.rb +106 -0
  21. data/exe/ffs_midiplay.rb +122 -0
  22. data/lib/fiddle_fluidsynth/audio_output/driver.rb +104 -0
  23. data/lib/fiddle_fluidsynth/audio_output/file_renderer.rb +84 -0
  24. data/lib/fiddle_fluidsynth/audio_output.rb +7 -0
  25. data/lib/fiddle_fluidsynth/command_interface/command_interface.rb +90 -0
  26. data/lib/fiddle_fluidsynth/command_interface/handler.rb +95 -0
  27. data/lib/fiddle_fluidsynth/command_interface/server.rb +79 -0
  28. data/lib/fiddle_fluidsynth/command_interface/shell.rb +76 -0
  29. data/lib/fiddle_fluidsynth/command_interface.rb +9 -0
  30. data/lib/fiddle_fluidsynth/core_ext/fiddle.rb +142 -0
  31. data/lib/fiddle_fluidsynth/core_ext/module.rb +123 -0
  32. data/lib/fiddle_fluidsynth/fiddle_fluidsynth.rb +172 -0
  33. data/lib/fiddle_fluidsynth/logging/logging.rb +82 -0
  34. data/lib/fiddle_fluidsynth/logging.rb +6 -0
  35. data/lib/fiddle_fluidsynth/midi_input/driver.rb +77 -0
  36. data/lib/fiddle_fluidsynth/midi_input/events.rb +255 -0
  37. data/lib/fiddle_fluidsynth/midi_input/midi_input.rb +70 -0
  38. data/lib/fiddle_fluidsynth/midi_input/player.rb +289 -0
  39. data/lib/fiddle_fluidsynth/midi_input/router.rb +225 -0
  40. data/lib/fiddle_fluidsynth/midi_input.rb +11 -0
  41. data/lib/fiddle_fluidsynth/misc/misc.rb +162 -0
  42. data/lib/fiddle_fluidsynth/misc.rb +6 -0
  43. data/lib/fiddle_fluidsynth/sequencer/events.rb +679 -0
  44. data/lib/fiddle_fluidsynth/sequencer/sequencer.rb +384 -0
  45. data/lib/fiddle_fluidsynth/sequencer.rb +7 -0
  46. data/lib/fiddle_fluidsynth/settings/settings.rb +465 -0
  47. data/lib/fiddle_fluidsynth/settings.rb +6 -0
  48. data/lib/fiddle_fluidsynth/soundfonts/generators.rb +128 -0
  49. data/lib/fiddle_fluidsynth/soundfonts/loader.rb +506 -0
  50. data/lib/fiddle_fluidsynth/soundfonts/modulators.rb +247 -0
  51. data/lib/fiddle_fluidsynth/soundfonts/soundfonts.rb +64 -0
  52. data/lib/fiddle_fluidsynth/soundfonts/voices.rb +178 -0
  53. data/lib/fiddle_fluidsynth/soundfonts.rb +11 -0
  54. data/lib/fiddle_fluidsynth/synth/audio_rendering.rb +100 -0
  55. data/lib/fiddle_fluidsynth/synth/effect/chorus.rb +269 -0
  56. data/lib/fiddle_fluidsynth/synth/effect/iir_filter.rb +81 -0
  57. data/lib/fiddle_fluidsynth/synth/effect/ladspa.rb +172 -0
  58. data/lib/fiddle_fluidsynth/synth/effect/reverb.rb +207 -0
  59. data/lib/fiddle_fluidsynth/synth/effect.rb +10 -0
  60. data/lib/fiddle_fluidsynth/synth/midi/messages.rb +292 -0
  61. data/lib/fiddle_fluidsynth/synth/midi/setup.rb +235 -0
  62. data/lib/fiddle_fluidsynth/synth/midi/tuning.rb +128 -0
  63. data/lib/fiddle_fluidsynth/synth/midi.rb +9 -0
  64. data/lib/fiddle_fluidsynth/synth/params/params.rb +200 -0
  65. data/lib/fiddle_fluidsynth/synth/params.rb +8 -0
  66. data/lib/fiddle_fluidsynth/synth/soundfont_management.rb +210 -0
  67. data/lib/fiddle_fluidsynth/synth/synth.rb +114 -0
  68. data/lib/fiddle_fluidsynth/synth/voice_control.rb +94 -0
  69. data/lib/fiddle_fluidsynth/synth.rb +18 -0
  70. data/lib/fiddle_fluidsynth/types/types.rb +131 -0
  71. data/lib/fiddle_fluidsynth/types.rb +10 -0
  72. data/lib/fiddle_fluidsynth/util/callback.rb +585 -0
  73. data/lib/fiddle_fluidsynth/util/interface/settings.rb +689 -0
  74. data/lib/fiddle_fluidsynth/util/interface/soundfont.rb +115 -0
  75. data/lib/fiddle_fluidsynth/util/interface/soundfont_preset.rb +69 -0
  76. data/lib/fiddle_fluidsynth/util/interface/soundfont_sample.rb +61 -0
  77. data/lib/fiddle_fluidsynth/util/interface.rb +11 -0
  78. data/lib/fiddle_fluidsynth/util/module_hier.rb +403 -0
  79. data/lib/fiddle_fluidsynth/util/util.rb +467 -0
  80. data/lib/fiddle_fluidsynth/util-after.rb +12 -0
  81. data/lib/fiddle_fluidsynth/util.rb +37 -0
  82. data/lib/fiddle_fluidsynth/version.rb +10 -0
  83. data/lib/fiddle_fluidsynth.rb +57 -0
  84. data/sig/fiddle_fluidsynth.rbs +4 -0
  85. 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
@@ -0,0 +1,7 @@
1
+ #
2
+ # filename: fiddle-fluidsynth/sequencer.rb
3
+ #
4
+ require_relative "./sequencer/sequencer"
5
+ require_relative "./sequencer/events"
6
+
7
+ #### endof filename: fiddle-fluidsynth/sequencer.rb