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,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
|
+
####
|
data/exe/ffs_midiplay.rb
ADDED
@@ -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,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
|