aubio 0.3.0 → 0.3.5

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.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Aubio
2
- VERSION = "0.3.0"
4
+ VERSION = '0.3.5'
3
5
  end
@@ -0,0 +1,132 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'aubio/version'
4
+ require_relative 'aubio/aubio-ffi'
5
+ require_relative 'aubio/onsets'
6
+ require_relative 'aubio/pitches'
7
+ require_relative 'aubio/beats'
8
+
9
+ module Aubio
10
+ class AubioException < RuntimeError; end
11
+ class FileNotFound < AubioException; end
12
+ class AlreadyClosed < AubioException; end
13
+ class InvalidAudioInput < AubioException; end
14
+
15
+ class Base
16
+ def initialize(path, params)
17
+ raise FileNotFound unless File.file?(path)
18
+
19
+ sample_rate = params[:sample_rate] || 44_100
20
+ hop_size = params[:hop_size] || 512
21
+
22
+ @is_closed = false
23
+ @source = Api.new_aubio_source(path, sample_rate, hop_size)
24
+ @params = params
25
+
26
+ check_for_valid_audio_source(path)
27
+ end
28
+
29
+ def close
30
+ Api.del_aubio_source(@source)
31
+ @is_closed = true
32
+ end
33
+
34
+ def onsets
35
+ check_for_closed
36
+
37
+ Onsets.new(@source, @params).each
38
+ end
39
+
40
+ def pitches
41
+ check_for_closed
42
+
43
+ Pitches.new(@source, @params).each
44
+ end
45
+
46
+ def enum_beats
47
+ check_for_closed
48
+
49
+ Beats.new(@source, @params).each
50
+ end
51
+
52
+ def beats
53
+ check_for_closed
54
+
55
+ beats = Beats.new(@source, @params).each.to_a
56
+
57
+ # fill in the zero beat
58
+ beats = beats.unshift(
59
+ beats.first.merge({
60
+ confidence: 1,
61
+ s: 0.0,
62
+ ms: 0.0,
63
+ sample_no: 0,
64
+ rel_start: 0.0
65
+ })
66
+ )
67
+
68
+ # fetch the rel_end from the next beat
69
+ # using 1.0 for the last beat
70
+ beats = beats.each_cons(2).map do |a, b|
71
+ a.merge({
72
+ rel_end: (b[:rel_start] || 1.0)
73
+ })
74
+ end
75
+
76
+ # set minimum inter-onset interval in seconds
77
+ # allows for 4/4 at 400bpm (faster than most music)
78
+ # filters beats detected too closely together
79
+ minioi = @params[:minioi] || 0.15
80
+ filtered_beats = [beats.first]
81
+ beats.each do |b|
82
+ filtered_beats << b if (b[:s] - filtered_beats.last[:s]) > minioi
83
+ end
84
+
85
+ # TODO: are there other smoothing methods that would be useful here?
86
+ filtered_beats
87
+ end
88
+
89
+ def bpm
90
+ check_for_closed
91
+
92
+ beat_locations = beats
93
+ beat_periods = beat_locations.each_cons(2).map { |a, b| b[:s] - a[:s] }
94
+
95
+ return 60.0 if beat_locations.length == 1
96
+
97
+ # use interquartile median to discourage outliers
98
+ s = beat_periods.length
99
+ qrt_lower_idx = (s / 4.0).floor
100
+ qrt_upper_idx = qrt_lower_idx * 3
101
+ interquartile_beat_periods = beat_periods[qrt_lower_idx..qrt_upper_idx]
102
+
103
+ # Calculate median
104
+ iqs = interquartile_beat_periods.length
105
+
106
+ iq_median_beat_period = interquartile_beat_periods.sort[(iqs / 2.0).floor - 1]
107
+ 60.0 / iq_median_beat_period
108
+ end
109
+
110
+ private
111
+
112
+ def check_for_closed
113
+ raise AlreadyClosed if @is_closed
114
+ end
115
+
116
+ def check_for_valid_audio_source(path)
117
+ @source.read_pointer
118
+ rescue FFI::NullPointerError
119
+ raise InvalidAudioInput, %(
120
+
121
+ Couldn't read file at #{path}
122
+ Did you install aubio with libsndfile support?
123
+ )
124
+ end
125
+ end
126
+ end
127
+
128
+ module Aubio
129
+ def self.open(path, params = {})
130
+ Base.new(path, params)
131
+ end
132
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aubio
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Xavier Riley
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-05-31 00:00:00.000000000 Z
11
+ date: 2020-08-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -28,30 +28,44 @@ dependencies:
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '1.11'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '1.11'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '10.0'
47
+ version: 12.3.3
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 12.3.3
55
+ - !ruby/object:Gem::Dependency
56
+ name: ffi_gen
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
- - - "~>"
66
+ - - ">="
53
67
  - !ruby/object:Gem::Version
54
- version: '10.0'
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: minitest
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -81,7 +95,7 @@ dependencies:
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
- name: ffi_gen
98
+ name: rubocop
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - ">="
@@ -113,16 +127,15 @@ files:
113
127
  - Rakefile
114
128
  - aubio-ffi-generator.rb
115
129
  - aubio.gemspec
116
- - aubio.rb
117
130
  - bin/console
118
131
  - bin/setup
119
- - lib/aubio.rb
120
132
  - lib/aubio/aubio-ffi.rb
121
133
  - lib/aubio/beats.rb
122
134
  - lib/aubio/legacy_api.rb
123
135
  - lib/aubio/onsets.rb
124
136
  - lib/aubio/pitches.rb
125
137
  - lib/aubio/version.rb
138
+ - lib/ruby_aubio.rb
126
139
  homepage: https://github.com/xavriley/ruby-aubio
127
140
  licenses:
128
141
  - MIT
@@ -142,8 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
155
  - !ruby/object:Gem::Version
143
156
  version: '0'
144
157
  requirements: []
145
- rubyforge_project:
146
- rubygems_version: 2.6.7
158
+ rubygems_version: 3.1.2
147
159
  signing_key:
148
160
  specification_version: 4
149
161
  summary: Ruby bindings for the aubio audio library
data/aubio.rb DELETED
@@ -1,467 +0,0 @@
1
- require 'ffi'
2
-
3
- module Aubio
4
- extend FFI::Library
5
- ffi_lib '/usr/local/Cellar/aubio/0.4.2/lib/libaubio.4.2.2.dylib'
6
-
7
- # tempo
8
- attach_function :new_aubio_tempo, [ :string, :int, :int, :int ], :pointer
9
- attach_function :aubio_tempo_do, [:pointer, :pointer, :pointer], :void
10
- attach_function :aubio_tempo_get_last, [:pointer], :int
11
- attach_function :aubio_tempo_get_last_s, [:pointer], :float
12
- attach_function :aubio_tempo_get_last_ms, [:pointer], :float
13
- attach_function :aubio_tempo_set_silence, [:pointer, :float], :int
14
- attach_function :aubio_tempo_get_silence, [:pointer], :float
15
- attach_function :aubio_tempo_set_threshold, [:pointer, :float], :int
16
- attach_function :aubio_tempo_get_threshold, [:pointer], :float
17
- attach_function :aubio_tempo_get_bpm, [:pointer], :float
18
- attach_function :aubio_tempo_get_confidence, [:pointer], :float
19
- attach_function :del_aubio_tempo, [:pointer], :void
20
-
21
- # beattracking / misc
22
- attach_function :new_aubio_beattracking, [:int, :int, :int], :pointer
23
- attach_function :aubio_beattracking_do, [:pointer, :pointer, :pointer], :void
24
- attach_function :aubio_beattracking_get_bpm, [:pointer], :float
25
- attach_function :aubio_filter_do, [:pointer, :pointer], :void
26
- attach_function :new_aubio_filter_a_weighting, [:int], :pointer
27
-
28
- # source
29
- attach_function :new_aubio_source, [:string, :int, :int], :pointer
30
- attach_function :aubio_source_do, [:pointer, :pointer, :pointer], :void
31
- attach_function :aubio_source_do_multi, [:pointer, :pointer, :pointer], :void
32
- attach_function :aubio_source_get_samplerate, [:pointer], :int
33
- attach_function :aubio_source_get_channels, [:pointer], :int
34
- attach_function :aubio_source_seek, [:pointer, :int], :int
35
- attach_function :aubio_source_close, [:pointer], :int
36
- attach_function :del_aubio_source, [:pointer], :void
37
-
38
- # sink
39
- attach_function :new_aubio_sink, [:string, :int], :pointer
40
- attach_function :aubio_sink_preset_samplerate, [:pointer, :int], :void
41
- attach_function :aubio_sink_preset_channels, [:pointer, :int], :void
42
- attach_function :aubio_sink_get_samplerate, [:pointer], :int
43
- attach_function :aubio_sink_get_channels, [:pointer], :int
44
- attach_function :aubio_sink_do, [:pointer, :pointer, :int], :void
45
- attach_function :aubio_sink_do_multi, [:pointer, :pointer, :int], :void
46
- attach_function :aubio_sink_close, [:pointer], :int
47
- attach_function :del_aubio_sink, [:pointer], :void
48
-
49
- # onset
50
- attach_function :new_aubio_onset, [:string, :int, :int, :int], :pointer
51
- attach_function :aubio_onset_do, [:pointer, :pointer, :pointer], :void
52
- attach_function :aubio_onset_get_last, [:pointer], :int
53
- attach_function :aubio_onset_get_last_s, [:pointer], :float
54
- attach_function :aubio_onset_get_last_ms, [:pointer], :float
55
- attach_function :aubio_onset_set_silence, [:pointer, :float], :int
56
- attach_function :aubio_onset_get_silence, [:pointer], :float
57
- attach_function :aubio_onset_get_descriptor, [:pointer], :float
58
- attach_function :aubio_onset_get_thresholded_descriptor, [:pointer], :float
59
- attach_function :aubio_onset_set_threshold, [:pointer, :float], :int
60
- attach_function :aubio_onset_set_minioi, [:pointer, :int], :int
61
- attach_function :aubio_onset_set_minioi_s, [:pointer, :int], :int
62
- attach_function :aubio_onset_set_minioi_ms, [:pointer, :float], :int
63
- attach_function :aubio_onset_set_delay, [:pointer, :int], :int
64
- attach_function :aubio_onset_set_delay_s, [:pointer, :int], :int
65
- attach_function :aubio_onset_set_delay_ms, [:pointer, :float], :int
66
- attach_function :aubio_onset_get_minioi, [:pointer], :int
67
- attach_function :aubio_onset_get_minioi_s, [:pointer], :float
68
- attach_function :aubio_onset_get_minioi_ms, [:pointer], :float
69
- attach_function :aubio_onset_get_delay, [:pointer], :int
70
- attach_function :aubio_onset_get_delay_s, [:pointer], :float
71
- attach_function :aubio_onset_get_delay_ms, [:pointer], :float
72
- attach_function :aubio_onset_get_threshold, [:pointer], :float
73
- attach_function :del_aubio_onset, [:pointer], :void
74
-
75
- # pitch
76
- attach_function :new_aubio_pitch, [:string, :int, :int, :int], :pointer
77
- attach_function :aubio_pitch_do, [:pointer, :pointer, :pointer], :void
78
- attach_function :aubio_pitch_set_tolerance, [:pointer, :int], :int
79
- attach_function :aubio_pitch_set_unit, [:pointer, :string], :int
80
- attach_function :aubio_pitch_set_silence, [:pointer, :float], :int
81
- attach_function :aubio_pitch_get_silence, [:pointer], :float
82
- attach_function :aubio_pitch_get_confidence, [:pointer], :float
83
- attach_function :del_aubio_pitch, [:pointer], :void
84
-
85
- # new fvec
86
- attach_function :new_fvec, [:int], :pointer
87
- attach_function :del_fvec, [:pointer], :void
88
- attach_function :fvec_get_sample, [:pointer, :int], :float
89
- attach_function :fvec_set_sample, [:pointer, :float, :int], :void
90
- attach_function :fvec_get_data, [:pointer], :float
91
- attach_function :fvec_print, [:pointer], :void
92
- attach_function :fvec_set_all, [:pointer, :float], :void
93
- attach_function :fvec_zeros, [:pointer], :void
94
- attach_function :fvec_rev, [:pointer], :void
95
- attach_function :fvec_weight, [:pointer, :pointer], :void
96
- attach_function :fvec_copy, [:pointer, :pointer], :void
97
- attach_function :fvec_ones, [:pointer], :void
98
-
99
- def self.onsets(path, params={})
100
- sample_rate = params[:sample_rate] || 44100
101
- window_size = params[:window_size] || 1024
102
- hop_size = params[:hop_size] || 512
103
-
104
- # parser.add_option("-O","--onset-method",
105
- # action="store", dest="onset_method", default='default',
106
- # metavar = "<onset_method>",
107
- # help="onset detection method [default=default] \
108
- # complexdomain|hfc|phase|specdiff|energy|kl|mkl")
109
- onset_method = params[:onset_method] || "default"
110
-
111
- # # cutting methods
112
- # parser.add_option("-b","--beat",
113
- # action="store_true", dest="beat", default=False,
114
- # help="use beat locations")
115
- beat = params[:beat] || false
116
- # """
117
- # parser.add_option("-S","--silencecut",
118
- # action="store_true", dest="silencecut", default=False,
119
- # help="use silence locations")
120
- silencecut = params[:silencecut] || false
121
-
122
- # parser.add_option("-s","--silence",
123
- # metavar = "<value>",
124
- # action="store", dest="silence", default=-70,
125
- # help="silence threshold [default=-70]")
126
- silence = params[:silence] || -70
127
-
128
- # """
129
- # # algorithm parameters
130
- # parser.add_option("-r", "--samplerate",
131
- # metavar = "<freq>", type='int',
132
- # action="store", dest="samplerate", default=0,
133
- # help="samplerate at which the file should be represented")
134
- # parser.add_option("-B","--bufsize",
135
- # action="store", dest="bufsize", default=512,
136
- # metavar = "<size>", type='int',
137
- # help="buffer size [default=512]")
138
- # parser.add_option("-H","--hopsize",
139
- # metavar = "<size>", type='int',
140
- # action="store", dest="hopsize", default=256,
141
- # help="overlap size [default=256]")
142
- # parser.add_option("-t","--onset-threshold",
143
- # metavar = "<value>", type="float",
144
- # action="store", dest="threshold", default=0.3,
145
- # help="onset peak picking threshold [default=0.3]")
146
- # parser.add_option("-c","--cut",
147
- # action="store_true", dest="cut", default=False,
148
- # help="cut input sound file at detected labels \
149
- # best used with option -L")
150
-
151
- # # minioi
152
- # parser.add_option("-M","--minioi",
153
- # metavar = "<value>", type='string',
154
- # action="store", dest="minioi", default="12ms",
155
- # help="minimum inter onset interval [default=12ms]")
156
-
157
- # """
158
- # parser.add_option("-D","--delay",
159
- # action = "store", dest = "delay", type = "float",
160
- # metavar = "<seconds>", default=0,
161
- # help="number of seconds to take back [default=system]\
162
- # default system delay is 3*hopsize/samplerate")
163
- # parser.add_option("-C","--dcthreshold",
164
- # metavar = "<value>",
165
- # action="store", dest="dcthreshold", default=1.,
166
- # help="onset peak picking DC component [default=1.]")
167
- # parser.add_option("-L","--localmin",
168
- # action="store_true", dest="localmin", default=False,
169
- # help="use local minima after peak detection")
170
- # parser.add_option("-d","--derivate",
171
- # action="store_true", dest="derivate", default=False,
172
- # help="derivate onset detection function")
173
- # parser.add_option("-z","--zerocross",
174
- # metavar = "<value>",
175
- # action="store", dest="zerothres", default=0.008,
176
- # help="zero-crossing threshold for slicing [default=0.00008]")
177
- # """
178
- # # plotting functions
179
- # """
180
- # parser.add_option("-p","--plot",
181
- # action="store_true", dest="plot", default=False,
182
- # help="draw plot")
183
- # parser.add_option("-x","--xsize",
184
- # metavar = "<size>",
185
- # action="store", dest="xsize", default=1.,
186
- # type='float', help="define xsize for plot")
187
- # parser.add_option("-y","--ysize",
188
- # metavar = "<size>",
189
- # action="store", dest="ysize", default=1.,
190
- # type='float', help="define ysize for plot")
191
- # parser.add_option("-f","--function",
192
- # action="store_true", dest="func", default=False,
193
- # help="print detection function")
194
- # parser.add_option("-n","--no-onsets",
195
- # action="store_true", dest="nplot", default=False,
196
- # help="do not plot detected onsets")
197
- # parser.add_option("-O","--outplot",
198
- # metavar = "<output_image>",
199
- # action="store", dest="outplot", default=None,
200
- # help="save plot to output.{ps,png}")
201
- # parser.add_option("-F","--spectrogram",
202
- # action="store_true", dest="spectro", default=False,
203
- # help="add spectrogram to the plot")
204
- # """
205
- # parser.add_option("-o","--output", type = str,
206
- # metavar = "<outputdir>",
207
- # action="store", dest="output_directory", default=None,
208
- # help="specify path where slices of the original file should be created")
209
- # parser.add_option("--cut-until-nsamples", type = int,
210
- # metavar = "<samples>",
211
- # action = "store", dest = "cut_until_nsamples", default = None,
212
- # help="how many extra samples should be added at the end of each slice")
213
- # parser.add_option("--cut-until-nslices", type = int,
214
- # metavar = "<slices>",
215
- # action = "store", dest = "cut_until_nslices", default = None,
216
- # help="how many extra slices should be added at the end of each slice")
217
-
218
- # parser.add_option("-v","--verbose",
219
- # action="store_true", dest="verbose", default=True,
220
- # help="make lots of noise [default]")
221
- # parser.add_option("-q","--quiet",
222
- # action="store_false", dest="verbose", default=True,
223
- # help="be quiet")
224
- # (options, args) = parser.parse_args()
225
- # if not options.source_file:
226
- # import os.path
227
- # if len(args) == 1:
228
- # options.source_file = args[0]
229
- # else:
230
- # print "no file name given\n", usage
231
- # sys.exit(1)
232
- # return options, args
233
-
234
- source = new_aubio_source(path, sample_rate, hop_size)
235
- onset = new_aubio_onset("default", 512, hop_size)
236
- aubio_onset_set_minioi_ms(onset, 12.0)
237
- aubio_onset_set_threshold(onset, 0.3)
238
-
239
- timestamps = []
240
- total_frames = 0
241
- # create output for source
242
- samples = new_fvec(hop_size)
243
- total_frames_counter = 0
244
- tmp_read = FFI::MemoryPointer.new(:int)
245
-
246
- loop do
247
- aubio_source_do(source, samples, tmp_read)
248
-
249
- end
250
- # if options.beat:
251
- # o = tempo(options.onset_method, bufsize, hopsize)
252
- # else:
253
- # o = onset(options.onset_method, bufsize, hopsize)
254
- # if options.minioi:
255
- # if options.minioi.endswith('ms'):
256
- # o.set_minioi_ms(int(options.minioi[:-2]))
257
- # elif options.minioi.endswith('s'):
258
- # o.set_minioi_s(int(options.minioi[:-1]))
259
- # else:
260
- # o.set_minioi(int(options.minioi))
261
- # o.set_threshold(options.threshold)
262
-
263
- # timestamps = []
264
- # total_frames = 0
265
- # # analyze pass
266
- # while True:
267
- # samples, read = s()
268
- # if o(samples):
269
- # timestamps.append (o.get_last())
270
- # if options.verbose: print "%.4f" % o.get_last_s()
271
- # total_frames += read
272
- # if read < hopsize: break
273
- # del s
274
- # # print some info
275
- # nstamps = len(timestamps)
276
- # duration = float (total_frames) / float(samplerate)
277
- # info = 'found %(nstamps)d timestamps in %(source_file)s' % locals()
278
- # info += ' (total %(duration).2fs at %(samplerate)dHz)\n' % locals()
279
- # sys.stderr.write(info)
280
-
281
- # # cutting pass
282
- # if options.cut and nstamps > 0:
283
- # # generate output files
284
- # from aubio.slicing import slice_source_at_stamps
285
- # timestamps_end = None
286
- # if options.cut_until_nslices and options.cut_until_nsamples:
287
- # print "warning: using cut_until_nslices, but cut_until_nsamples is set"
288
- # if options.cut_until_nsamples:
289
- # timestamps_end = [t + options.cut_until_nsamples for t in timestamps[1:]]
290
- # timestamps_end += [ 1e120 ]
291
- # if options.cut_until_nslices:
292
- # timestamps_end = [t for t in timestamps[1 + options.cut_until_nslices:]]
293
- # timestamps_end += [ 1e120 ] * (options.cut_until_nslices + 1)
294
- # slice_source_at_stamps(source_file, timestamps, timestamps_end = timestamps_end,
295
- # output_dir = options.output_directory,
296
- # samplerate = samplerate)
297
-
298
- # # print some info
299
- # duration = float (total_frames) / float(samplerate)
300
- # info = 'created %(nstamps)d slices from %(source_file)s' % locals()
301
- # info += ' (total %(duration).2fs at %(samplerate)dHz)\n' % locals()
302
- # sys.stderr.write(info)
303
- end
304
-
305
- def self.get_features(path, params={})
306
- sample_rate = params[:sample_rate] || 44100
307
- window_size = params[:window_size] || 1024
308
- hop_size = params[:hop_size] || 512
309
-
310
- source = new_aubio_source(path, sample_rate, hop_size)
311
- calculated_sample_rate = aubio_source_get_samplerate(source)
312
- puts "samplerate: #{calculated_sample_rate}"
313
-
314
- onset = new_aubio_onset('default', window_size, hop_size, sample_rate)
315
- aubio_onset_set_minioi_ms(onset, 12.0)
316
- aubio_onset_set_threshold(onset, 0.3)
317
- onsets = []
318
-
319
- pitch = new_aubio_pitch('default', window_size, hop_size, sample_rate)
320
- aubio_pitch_set_unit(pitch, 'Hz')
321
-
322
- # create output for source
323
- samples = new_fvec(hop_size)
324
- # create output for pitch and beat
325
- out_fvec = new_fvec(1)
326
- total_frames_counter = 0
327
- tmp_read = FFI::MemoryPointer.new(:int)
328
-
329
- loop do
330
- aubio_source_do(source, samples, tmp_read)
331
-
332
- aubio_pitch_do(pitch, samples, out_fvec)
333
-
334
- cur_time = total_frames_counter / sample_rate
335
- last_pitch = fvec_get_sample(out_fvec, 0);
336
-
337
- #puts "pitch at #{cur_time} seconds: #{last_pitch} Hz"
338
-
339
- aubio_onset_do(onset, samples, out_fvec)
340
- is_onset = fvec_get_sample(out_fvec, 0)
341
-
342
- if is_onset > 0.0
343
- last_onset = aubio_onset_get_last_s(onset)
344
- onsets << last_onset
345
- puts "onset at #{last_onset}"
346
- end
347
-
348
- read = tmp_read.read_int
349
- total_frames_counter += read
350
- if(read != hop_size) then
351
- break
352
- end
353
- end
354
-
355
- cur_time = total_frames_counter.to_f / sample_rate;
356
- puts "total time : #{cur_time} seconds (#{total_frames_counter} frames)"
357
- puts "found #{onsets.length} onsets total"
358
-
359
- # cleanup
360
- del_aubio_source(source);
361
- del_aubio_onset(onset);
362
- del_aubio_pitch(pitch);
363
-
364
- onsets
365
- end
366
-
367
- # # change comments, swap args, convert to sym
368
-
369
- # intPtr = 'int'
370
- # stringPtr = "string" #ref.refType(ref.types.CString);
371
-
372
- # {
373
- # "aubio_tempo_do": [ "void", [ "pointer", "pointer", "pointer"]],
374
- # "aubio_tempo_get_last": [ "int", ["pointer"]],
375
- # "aubio_tempo_get_last_s": [ "float", ["pointer"]],
376
- # "aubio_tempo_get_last_ms": [ "float", ["pointer"]],
377
- # "aubio_tempo_set_silence": [ "int", ["pointer", "float"]],
378
- # "aubio_tempo_get_silence": [ "float", ["pointer"]],
379
- # "aubio_tempo_set_threshold": [ "int", ["pointer", "float"]],
380
- # "aubio_tempo_get_threshold": [ "float", ["pointer"]],
381
- # "aubio_tempo_get_bpm": [ "float", ["pointer"]],
382
- # "aubio_tempo_get_confidence": [ "float", ["pointer"]],
383
- # "del_aubio_tempo": [ "void", ["pointer"]],
384
-
385
- # # beattracking / misc
386
- # "new_aubio_beattracking": [ "pointer", [ "int", "int", "int"]],
387
- # "aubio_beattracking_do": [ "void", [ "pointer", "pointer", "pointer"]],
388
- # "aubio_beattracking_get_bpm": [ "float", ["pointer"]],
389
- # "aubio_filter_do": [ "void", [ "pointer", "pointer" ]],
390
- # "new_aubio_filter_a_weighting": [ "pointer", [ "int" ]],
391
-
392
- # # source
393
- # "new_aubio_source": [ "pointer", [ "string", "int", "int" ]],
394
- # "aubio_source_do": [ "void", [ "pointer", "pointer", intPtr ]],
395
- # "aubio_source_do_multi": [ "void", [ "pointer", "pointer", intPtr ]],
396
- # "aubio_source_get_samplerate": [ "int", [ "pointer" ]],
397
- # "aubio_source_get_channels": [ "int", [ "pointer" ]],
398
- # "aubio_source_seek": [ "int", [ "pointer", "int" ]],
399
- # "aubio_source_close": [ "int", [ "pointer" ]],
400
- # "del_aubio_source": [ "void", [ "pointer" ]],
401
-
402
- # # sink
403
- # "new_aubio_sink": [ "pointer", [ "string", "int" ]],
404
- # "aubio_sink_preset_samplerate": [ "void", [ "pointer", "int" ]],
405
- # "aubio_sink_preset_channels": [ "void", [ "pointer", "int" ]],
406
- # "aubio_sink_get_samplerate": [ "int", [ "pointer" ]],
407
- # "aubio_sink_get_channels": [ "int", [ "pointer" ]],
408
- # "aubio_sink_do": ["void", ["pointer", "pointer", "int"]],
409
- # "aubio_sink_do_multi": ["void", ["pointer", "pointer", "int"]],
410
- # "aubio_sink_close": [ "int", [ "pointer" ]],
411
- # "del_aubio_sink": [ "void", [ "pointer" ]],
412
-
413
- # # onset
414
- # "new_aubio_onset": [ "pointer", [ "string", "int", "int", "int"]],
415
- # "aubio_onset_do": [ "void", [ "pointer", "pointer", "pointer"]],
416
- # "aubio_onset_get_last": [ "int", ["pointer"]],
417
- # "aubio_onset_get_last_s": [ "float", ["pointer"]],
418
- # "aubio_onset_get_last_ms": [ "float", ["pointer"]],
419
- # "aubio_onset_set_silence": [ "int", ["pointer", "float"]],
420
- # "aubio_onset_get_silence": [ "float", ["pointer"]],
421
- # "aubio_onset_get_descriptor": [ "float", ["pointer"]],
422
- # "aubio_onset_get_thresholded_descriptor": [ "float", ["pointer"]],
423
- # "aubio_onset_set_threshold": [ "int", ["pointer", "float"]],
424
- # "aubio_onset_set_minioi": [ "int", ["pointer", "int"]],
425
- # "aubio_onset_set_minioi_s": [ "int", ["pointer", "int"]],
426
- # "aubio_onset_set_minioi_ms": [ "int", ["pointer", "float"]],
427
- # "aubio_onset_set_delay": [ "int", ["pointer", "int"]],
428
- # "aubio_onset_set_delay_s": [ "int", ["pointer", "int"]],
429
- # "aubio_onset_set_delay_ms": [ "int", ["pointer", "float"]],
430
- # "aubio_onset_get_minioi": [ "int", ["pointer"]],
431
- # "aubio_onset_get_minioi_s": [ "float", ["pointer"]],
432
- # "aubio_onset_get_minioi_ms": [ "float", ["pointer"]],
433
- # "aubio_onset_get_delay": [ "int", ["pointer"]],
434
- # "aubio_onset_get_delay_s": [ "float", ["pointer"]],
435
- # "aubio_onset_get_delay_ms": [ "float", ["pointer"]],
436
- # "aubio_onset_get_threshold": [ "float", ["pointer"]],
437
- # "del_aubio_onset": [ "void", ["pointer"]],
438
-
439
- # # pitch
440
- # "new_aubio_pitch": [ "pointer", [ "string", "int", "int", "int"]],
441
- # "aubio_pitch_do": ["void", ["pointer", "pointer", "pointer"]],
442
- # "aubio_pitch_set_tolerance": [ "int", ["pointer", "int"]],
443
- # "aubio_pitch_set_unit": ["int", ["pointer", "string"]],
444
- # "aubio_pitch_set_silence": ["int", ["pointer", "float"]],
445
- # "aubio_pitch_get_silence": ["float", ["pointer"]],
446
- # "aubio_pitch_get_confidence": ["float", ["pointer"]],
447
- # "del_aubio_pitch": [ "void", ["pointer"]],
448
-
449
- # # fvec
450
- # "new_fvec": [ "pointer", [ "int" ]],
451
- # "del_fvec": [ "void", [ "pointer" ]],
452
- # "fvec_get_sample": [ "float", [ "pointer", "int" ]],
453
- # "fvec_set_sample": [ "void", [ "pointer", "float", "int" ]],
454
- # "fvec_get_data": [ "float", [ "pointer" ]],
455
- # "fvec_print": [ "void", [ "pointer" ]],
456
- # "fvec_set_all": [ "void", [ "pointer", "float" ]],
457
- # "fvec_zeros": [ "void", [ "pointer" ]],
458
- # "fvec_rev": [ "void", [ "pointer" ]],
459
- # "fvec_weight": [ "void", [ "pointer", "pointer" ]],
460
- # "fvec_copy": [ "void", [ "pointer", "pointer" ]],
461
- # "fvec_ones": [ "void", [ "pointer" ]],
462
- # }.each do |k,v|
463
- # puts "attach_function :#{k.to_sym}, #{v.last.map(&:to_sym)}, :#{v.first.to_sym}"
464
- # end
465
- end
466
-
467
- puts Aubio.get_features("/Applications/Sonic Pi.app/etc/samples/loop_amen.flac", hop_size: 256, sample_rate: 44100).inspect