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,18 @@
1
+ #! /usr/bin/env ruby
2
+ #
3
+ #
4
+
5
+ # Fiddle::Pointer read/write example.
6
+ #
7
+ #
8
+ require_relative "#{__dir__}/../lib/fiddle-fluidsynth"
9
+ #require "fiddle_fluidsynth"
10
+
11
+
12
+ dbl_p = Fiddle::Pointer.malloc_dbl
13
+ Fiddle::Pointer.set_dbl(dbl_p, 4.6692)
14
+ fbc = Fiddle::Pointer.decode1_dbl(dbl_p)
15
+ puts "decoded: #{fbc}"
16
+
17
+
18
+ ####
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ #
4
+
5
+ # presets-each.rb - list all presets of SoundFont files with
6
+ # bank and preset number.
7
+ # (SoundFont instance's `#each_preset` example)
8
+ #
9
+ # This code is in the public domain.
10
+ #
11
+ # [YAMAMOTO, Masayuki]
12
+
13
+ require_relative '../lib/fiddle_fluidsynth'
14
+ #require 'fiddle_fluidsynth'
15
+
16
+
17
+ #
18
+ if ARGV[0].to_s == '-h' || ARGV[0].to_s == '--help'
19
+ puts "#{__FILE__} [soundfont fullpath]"
20
+ exit 0
21
+ end
22
+
23
+ #
24
+ fs = if ARGV[0].nil?
25
+ FiddleFluidSynth.new
26
+ else
27
+ FiddleFluidSynth.new(soundfont_full_path: ARGV[0])
28
+ end
29
+ fs.start
30
+
31
+ #
32
+ puts "sfid_ary: #{fs.sfid_ary}"
33
+
34
+ #
35
+ sfcount = fs.sfonts.size
36
+ fs.sfonts.each_with_index do |sfont, _i|
37
+
38
+ #
39
+ sfid = sfont.sfid
40
+ name = sfont.name
41
+
42
+ #
43
+ puts "#{_i+1}/#{sfcount}. sfont: #{name}, sfid: #{sfid}" +
44
+ " (sfont instance addr: 0x#{sfont.to_i.to_s(16)}:#{sfont.class})"
45
+
46
+ #
47
+ sfont.each_preset do |_preset|
48
+ name = _preset.name
49
+ prenum = _preset.num
50
+ bknum = _preset.bknum
51
+
52
+ #
53
+ puts " %05d:%03d" % [bknum,prenum] +
54
+ ", name: #{name}" +
55
+ " (preset obj addr: 0x#{_preset.to_i.to_s(16)})"
56
+ end
57
+
58
+ end
59
+
60
+
61
+ #
62
+ fs.raise_error_in_callback
63
+ fs.delete
64
+
65
+
66
+ ####
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ #
4
+
5
+ # presets-full_scan.rb - list all presets (full-scan version).
6
+ # traverse all presets in the bank number x program number space.
7
+ #
8
+ # This code is in the public domein.
9
+ # [YAMAMOTO, Masayuki]
10
+ #
11
+
12
+ require_relative '../lib/fiddle_fluidsynth'
13
+ #require 'fiddle_fluidsynth'
14
+
15
+
16
+ # fs = FiddleFluidSynth.new(soundfont_name: nil)
17
+ #reset_presets = 1
18
+ reset_presets = 0
19
+ fs = if ARGV[0].nil?
20
+ FiddleFluidSynth.new(reset_presets: reset_presets)
21
+ else
22
+ FiddleFluidSynth.new(
23
+ soundfont_full_path: ARGV[0], reset_presets: reset_presets)
24
+ end
25
+ fs.start
26
+
27
+ #
28
+ # sfont = fs.sfont_new
29
+ puts "sfid_ary: #{fs.sfid_ary}"
30
+
31
+ #
32
+ fs.sfonts.each_with_index do |sfont, _i|
33
+ #name = fs.sfont_get_name(sfont)
34
+ name = sfont.name
35
+ puts "#{_i+1}. sfont: #{name}" +
36
+ " (sfont instance addr: 0x#{sfont.to_i.to_s(16)})"
37
+
38
+ #
39
+ for bknum in fs.bknum_range_whole
40
+ for pgnum in fs.pgnum_range_whole
41
+ #_preset = fs.sfont_get_preset(sfont, bknum: bknum, prenum: pgnum)
42
+ _preset = fs.sfont_get_preset(sfont, bknum: bknum, prenum: pgnum)
43
+
44
+ if !(_preset.null?)
45
+ name = fs.preset_get_name(_preset)
46
+ prenum = fs.preset_get_num(_preset)
47
+ bknum = fs.preset_get_bknum(_preset)
48
+ puts " %05d:%03d %s" % [bknum,prenum,name] +
49
+ " (preset obj addr: 0x#{_preset.to_i.to_s(16)})"
50
+ end
51
+ end
52
+ end
53
+
54
+ end
55
+
56
+
57
+ #
58
+ fs.raise_error_in_callback
59
+ fs.delete
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ #
4
+
5
+ # List all settings (settings' iterator test program).
6
+ #
7
+ # References:
8
+ # - Libfluidsynth, [Settings Reference](https://www.fluidsynth.org/api/fluidsettings.html)
9
+ #
10
+
11
+ #
12
+ require_relative '../lib/fiddle_fluidsynth'
13
+ #require 'fiddle_fluidsynth'
14
+
15
+
16
+ # fs = FiddleFluidSynth.new(soundfont_name: nil)
17
+ fs = if ARGV[0].nil?
18
+ FiddleFluidSynth.new
19
+ else
20
+ FiddleFluidSynth.new(soundfont_full_path: ARGV[0])
21
+ end
22
+
23
+ #
24
+ #
25
+ #
26
+ item_cnt = 0
27
+ fs.settings.each_setting{|data, name, type|
28
+ item_cnt +=1
29
+
30
+ #
31
+ # $stderr.puts "{each_setting} data: #{data.null?}," +
32
+ # " name: #{name}, type: #{type}"
33
+ puts "item (#{item_cnt}): \"#{name}\", type: #{type}"
34
+
35
+ #
36
+ mname = FiddleFluidSynth.settings_item_to_meth_name(name)
37
+ mname_default = mname + "_default"
38
+ mname_range = mname + "_range"
39
+ msg = ""
40
+ if fs.settings.respond_to?(mname)
41
+ msg += " value: #{fs.settings.send(mname)}" +
42
+ " (default: #{fs.settings.send(mname_default)}"
43
+ msg += ", range: #{fs.settings.send(mname_range)}" unless \
44
+ fs.settings.send(mname_range).nil?
45
+ msg += ")"
46
+ else
47
+ puts "[BUG] item \"#{name}\" does NOT respond to ##{mname}..."
48
+ end
49
+ puts "#{msg}"
50
+
51
+ #
52
+ puts " notype?: #{fs.setting_type_is_notype?(type)}"
53
+ puts " num?: #{fs.setting_type_is_num?(type)}"
54
+ puts " int?: #{fs.setting_type_is_int?(type)}"
55
+ puts " str?: #{fs.setting_type_is_str?(type)}"
56
+ puts " set?: #{fs.setting_type_is_set?(type)}"
57
+
58
+ #
59
+ hints = fs.settings.hints_of(name)
60
+ if hints.nil?
61
+ puts "[ERROR] get_hints() is failed!"
62
+ end
63
+ puts " hints: #{hints}"
64
+
65
+ hint_bounded_above_f = fs.setting_hints_is_bounded_above?(hints)
66
+ hint_bounded_below_f = fs.setting_hints_is_bounded_below?(hints)
67
+ hint_optionlist_f = fs.setting_hints_is_optionlist?(hints)
68
+ hint_toggled_f = fs.setting_hints_is_toggled?(hints)
69
+
70
+ puts " bounded above?: #{hint_bounded_above_f}"
71
+ puts " bounded below?: #{hint_bounded_below_f}"
72
+ puts " optionlist?: #{hint_optionlist_f}"
73
+ puts " toggled?: #{hint_toggled_f}"
74
+
75
+ #
76
+ if fs.setting_type_is_str?(type) &&
77
+ fs.setting_hints_is_optionlist?(hints)
78
+ # fs.settings.hints_is_optionlist?(name)
79
+
80
+ tmp_opts = []
81
+ fs.settings.each_option_of(name){|data,name,option|
82
+ tmp_opts << option
83
+ }
84
+ puts " #{name} is string and optionlist:"
85
+ puts " opt. (#{tmp_opts.size}):"
86
+ tmp_opts.each_with_index do |anopt, _i|
87
+ puts " (#{_i+1}) \"#{anopt}\""
88
+ end
89
+ else
90
+ # puts " #{name} is NOT string and optionlist:"
91
+ end
92
+
93
+ # test.
94
+ # raise SyntaxError, "test."
95
+ #
96
+ }
97
+ puts
98
+
99
+
100
+ #
101
+ fs.raise_error_in_callback
102
+ fs.delete
103
+ puts "end."
104
+
105
+
106
+ ####
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ #
4
+ #
5
+
6
+ # ffs_midiplay.rb - fiddle_fluidsynth MIDI file player (tick callback
7
+ # test program).
8
+ # This code is in the public domain.
9
+ #
10
+ # [YAMAMOTO, Masayuki]
11
+ #
12
+
13
+ #
14
+ #require_relative '../lib/fiddle_fluidsynth'
15
+ require 'fiddle_fluidsynth'
16
+
17
+
18
+ #
19
+ DEFAULT_SF2_NAME = "default.sf2"
20
+ f_1 = ARGV[0]
21
+ f_2 = ARGV[1]
22
+
23
+ f_midi = f_2 || f_1
24
+ f_sf2 = (f_2.nil?)? DEFAULT_SF2_NAME : f_1
25
+ puts "SoundFont: #{f_sf2}, MIDI file #{f_midi}"
26
+
27
+ if f_midi.nil?
28
+ $stderr.puts "Help: #{File.basename(__FILE__)} [SoundFont] MIDI-file"
29
+ raise "Specify a MIDI file you want to play at least."
30
+ end
31
+
32
+ #
33
+ #
34
+ #
35
+ fs = if File.exist?(f_sf2)
36
+ FiddleFluidSynth.new(soundfont_full_path: f_sf2)
37
+ else
38
+ FiddleFluidSynth.new(soundfont_name: f_sf2)
39
+ end
40
+ fs.start
41
+
42
+ #
43
+ #
44
+ #
45
+ is_midi = fs.is_midifile(f_midi)
46
+ raise "MIDI file is strange (#{is_midi}): #{f_midi}" \
47
+ unless fs.is_midifile?(f_midi)
48
+
49
+ ver_s = fs.fluidsynth_version_str
50
+ ver_ary = fs.fluidsynth_version
51
+
52
+ puts "MIDI file (#{is_midi}): #{f_midi}"
53
+ puts "fluidsynth version_str: #{ver_s} (by version: #{ver_ary})"
54
+ puts
55
+
56
+ #
57
+ #
58
+ #
59
+ fs.player_file(f_midi)
60
+ time_start = Time.now
61
+ puts "#{time_start}: Playing #{f_midi}"
62
+
63
+
64
+ #
65
+ # we can pass user_data via handler_data as follows, but this is completely
66
+ # meaningless in FiddleFluidSynth.
67
+ #
68
+ # because we use closure to define the callback function, i.e.,
69
+ # we can use any variables in the callback freely.
70
+ #
71
+ # ```
72
+ # str_ptr = FFI::MemoryPointer.from_string("this is a test.")
73
+ # fdl_ptr = Fiddle::Pointer.new(str_ptr.address)
74
+ #
75
+ # fs.player_set_tick_callback(handler_data: fdl_ptr_ary){|user_data, cur_tick|
76
+ # :
77
+ # puts "#{user_data}/#{user_data.read_string}" # user_data is FFI::Pointer.
78
+ # :
79
+ # }
80
+ # ```
81
+ #
82
+ fs.player_set_tick_callback{|user_data, cur_tick|
83
+ #
84
+ total_ticks = fs.player_get_total_ticks
85
+
86
+ #
87
+ status = fs.player_status
88
+ bpm = fs.player_bpm
89
+
90
+ #
91
+ # puts "#{user_data}/#{user_data.address}"
92
+ # puts "#{user_data}/#{user_data.read_string}"
93
+ puts "#{Time.now}: player status: #{status}/bpm: #{bpm}"
94
+
95
+ #
96
+ if cur_tick <= total_ticks
97
+ puts "Tick: %4d / %4d" % [cur_tick, total_ticks]
98
+ else
99
+ puts "(**) All events in the MIDI file are executed" +
100
+ " (Tick: %4d / %4d)" % [cur_tick, total_ticks]
101
+ end
102
+ }
103
+
104
+
105
+ #
106
+ #
107
+ #
108
+ until fs.player_is_done?
109
+ sleep(1.0)
110
+ end
111
+
112
+
113
+ #
114
+ #
115
+ #
116
+ fs.raise_error_in_callback
117
+ fs.delete
118
+ time_end = Time.now
119
+ puts "#{time_end}: Finished (in #{time_end-time_start} [sec])."
120
+
121
+
122
+ #### end.
@@ -0,0 +1,104 @@
1
+ #
2
+ # filename: fiddle-fluidsynth/audio_output/driver.rb
3
+ #
4
+
5
+
6
+ # References
7
+ # - fluidsynth.org, [API Reference](https://www.fluidsynth.org/api/modules.html)
8
+ #
9
+ class FiddleFluidSynth
10
+
11
+ #
12
+ module C
13
+
14
+ # Functions for managing audio drivers and file renderers.
15
+ # ==== References
16
+ # - Audio Output/[Audio Driver](https://www.fluidsynth.org/api/group__audio__driver.html)
17
+ # - [library fiddle](https://docs.ruby-lang.org/ja/latest/library/fiddle.html)
18
+ #
19
+
20
+ ### basic types are in types/types.rb
21
+
22
+ # Callback function type used with new_fluid_audio_driver2() to allow
23
+ # for custom user audio processing before the audio is sent to the driver.
24
+ typealias 'fluid_audio_func_t', 'void'
25
+
26
+
27
+ # Lifecycle Functions.
28
+ #
29
+ #
30
+ extern 'fluid_audio_driver_t* new_fluid_audio_driver' +
31
+ '(fluid_settings_t*, fluid_synth_t*)'
32
+ extern 'fluid_audio_driver_t* new_fluid_audio_driver2' +
33
+ '(fluid_settings_t*, fluid_audio_func_t*, void*)'
34
+ extern 'void delete_fluid_audio_driver(fluid_audio_driver_t*)' #
35
+
36
+
37
+ # Functions.
38
+ #
39
+ #
40
+ extern 'int fluid_audio_driver_register(char**)' #
41
+
42
+ end
43
+ end
44
+
45
+
46
+ #
47
+ #
48
+ #
49
+ class FiddleFluidSynth
50
+
51
+ # Create a new audio driver.
52
+ #
53
+ def self.audio_driver_new( synth: , settings: )
54
+ ret = C.new_fluid_audio_driver(settings, synth)
55
+ # ret.extend(Interface::AudioOutputDriver)
56
+ #
57
+ ret
58
+ end
59
+ def audio_driver_new( synth: self.synth, settings: self.settings )
60
+ self.class.audio_driver_new(synth: synth, settings: settings)
61
+ end
62
+
63
+
64
+ # Create a new audio driver.
65
+ # ==== Args
66
+ #
67
+ def self.audio_driver_new2( settings: , audio_func: , data: nil )
68
+ ret = C.new_fluid_audio_driver2(settings, audio_func, data)
69
+ # ret.extend(Interface::AudioOutputDriver)
70
+ #
71
+ ret
72
+ end
73
+ def audio_driver_new2( audio_func: , data: nil, settings: self.settings )
74
+ self.class.audio_driver_new2(
75
+ audio_func: audio_func, data: data, settings: settings)
76
+ end
77
+
78
+
79
+ # Deletes an audio driver instance.
80
+ def self.audio_driver_delete( driver )
81
+ ret = C.delete_fluid_audio_driver(driver)
82
+ ret
83
+ end
84
+ def audio_driver_delete( driver = self.audio_driver )
85
+ self.class.audio_driver_delete(driver)
86
+ end
87
+
88
+ end
89
+
90
+ #
91
+ #
92
+ #
93
+ class FiddleFluidSynth
94
+
95
+ # Registers audio drivers to use.
96
+ def audio_driver_register( adrivers = nil )
97
+ ret = C.fluid_audio_driver_register(adrivers)
98
+ ret
99
+ end
100
+
101
+ end
102
+
103
+
104
+ #### endof filename: fiddle-fluidsynth/audio_output/driver.rb
@@ -0,0 +1,84 @@
1
+ #
2
+ # filename: fiddle-fluidstynth/audio_output/file_renderer.rb
3
+ #
4
+
5
+
6
+ # References
7
+ # - fluidsynth.org, [API Reference](https://www.fluidsynth.org/api/modules.html)
8
+ #
9
+ class FiddleFluidSynth
10
+
11
+ # Functions for managing file renderers and triggering the rendering.
12
+ # ==== References
13
+ # - Audio Output/[File Renderer](https://www.fluidsynth.org/api/group__file__renderer.html)
14
+ # - [library fiddle](https://docs.ruby-lang.org/ja/latest/library/fiddle.html)
15
+ #
16
+
17
+ #
18
+ module C
19
+
20
+
21
+ # Lifecycle Functions.
22
+ #
23
+ #
24
+ extern 'fluid_file_renderer_t* new_fluid_file_renderer(fluid_synth_t*)'
25
+ extern 'void delete_fluid_file_renderer(fluid_file_renderer_t*)'
26
+
27
+ # Functions.
28
+ #
29
+ #
30
+ extern 'int fluid_file_renderer_process_block(fluid_file_renderer_t*)'
31
+ extern 'int fluid_file_set_encoding_quality(fluid_file_renderer_t*, double)'
32
+
33
+ end
34
+ end
35
+
36
+
37
+ #
38
+ #
39
+ #
40
+ class FiddleFluidSynth
41
+
42
+ # Create a new file renderer and open the file.
43
+ #def self.file_renderer_new( synth: )
44
+ def self.file_renderer_new( synth )
45
+ ret = C.new_fluid_file_renderer(synth)
46
+ ret
47
+ end
48
+ # def file_renderer_new( synth: self.synth )
49
+ def file_renderer_new( synth = self.synth )
50
+ self.class.file_renderer_new(synth)
51
+ end
52
+
53
+ # Close file and destroy a file renderer object.
54
+ def self.file_renderer_delete( dev )
55
+ ret = C.delete_fluid_file_renderer(dev)
56
+ ret
57
+ end
58
+ def file_renderer_delete( dev = self.file_renderer )
59
+ self.class.file_renderer_delete(dev)
60
+ end
61
+
62
+ end
63
+
64
+ #
65
+ #
66
+ #
67
+ class FiddleFluidSynth
68
+
69
+ # Write period_size samples to file.
70
+ def file_renderer_process_block( dev )
71
+ ret = C.fluid_file_renderer_process_block(dev)
72
+ ret
73
+ end
74
+
75
+ # Set vbr encoding quality (only available with libsndfile support)
76
+ def file_renderer_set_encoding_quality( dev: , q: )
77
+ ret = C.fluid_file_set_encoding_quality(dev, q)
78
+ ret
79
+ end
80
+
81
+ end
82
+
83
+
84
+ #### endof filename: fiddle-fluidstynth/audio_output/file_renderer.rb
@@ -0,0 +1,7 @@
1
+ #
2
+ # filename: audio_output.rb
3
+ #
4
+ require_relative "./audio_output/driver"
5
+ require_relative "./audio_output/file_renderer"
6
+
7
+ ####
@@ -0,0 +1,90 @@
1
+ #
2
+ # filename: fiddle-fluidstynth/command_interface/command_interface.rb
3
+ #
4
+
5
+
6
+ # References
7
+ # - [API Reference](https://www.fluidsynth.org/api/modules.html)
8
+ #
9
+ class FiddleFluidSynth
10
+
11
+ # Control and configuration interface.
12
+ # ==== References
13
+ # - API References, [Command Interface](https://www.fluidsynth.org/api/group__command__interface.html)
14
+ # - [library fiddle](https://docs.ruby-lang.org/ja/latest/library/fiddle.html)
15
+ #
16
+
17
+ #
18
+ module C
19
+
20
+ # Functions.
21
+ #
22
+ #
23
+
24
+ # Get standard in stream handle.
25
+ extern 'fluid_istream_t fluid_get_stdin(void)'
26
+
27
+ # Get standard output stream handle.
28
+ extern 'fluid_ostream_t fluid_get_stdout(void)'
29
+
30
+ # Get the system FluidSynth command file name.
31
+ extern 'char* fluid_get_sysconf(char*, int)'
32
+
33
+ # Get the user specific FluidSynth command file name.
34
+ extern 'char* fluid_get_userconf(char*, int)'
35
+
36
+ end
37
+ end
38
+
39
+
40
+ #
41
+ #
42
+ #
43
+ class FiddleFluidSynth
44
+
45
+ def self.get_stdin
46
+ ret = C.fluid_get_stdin()
47
+ ret
48
+ end
49
+ def get_stdin
50
+ self.class.get_stdin()
51
+ end
52
+
53
+ def self.get_stdout
54
+ ret = C.fluid_get_stdout()
55
+ ret
56
+ end
57
+ def get_stdout
58
+ self.class.get_stdout()
59
+ end
60
+
61
+ #
62
+ # ==== Args
63
+ # buf:: Caller supplied string buffer to store file name to.
64
+ # len:: Length of buf.
65
+ #
66
+ def self.get_sysconf( buf, len )
67
+ ret = C.fluid_get_sysconf(buf, len)
68
+ ret
69
+ end
70
+ def get_sysconf( buf, len )
71
+ self.class.get_sysconf(buf, len)
72
+ end
73
+
74
+ #
75
+ # ==== Args
76
+ # buf:: Caller supplied string buffer to store file name to.
77
+ # len:: Length of buf.
78
+ #
79
+ def self.get_userconf( buf, len )
80
+ ret = C.fluid_get_userconf(buf, len)
81
+ ret
82
+ end
83
+ def get_userconf( buf, len )
84
+ self.class.get_userconf(buf, len)
85
+ end
86
+
87
+ end
88
+
89
+
90
+ #### endof filename: fiddle-fluidstynth/command_interface/command_interface.rb