aubio 0.3.0 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,93 +0,0 @@
1
- require_relative "aubio/version"
2
- require_relative "aubio/aubio-ffi"
3
- require_relative "aubio/onsets"
4
- require_relative "aubio/pitches"
5
- require_relative "aubio/beats"
6
-
7
- module Aubio
8
- class AubioException < Exception; end
9
- class FileNotFound < AubioException; end
10
- class AlreadyClosed < AubioException; end
11
- class InvalidAudioInput < AubioException; end
12
-
13
- class Base
14
- def initialize(path, params)
15
- raise FileNotFound unless File.file?(path)
16
-
17
- sample_rate = params[:sample_rate] || 44100
18
- hop_size = params[:hop_size] || 512
19
-
20
- @source = Api.new_aubio_source(path, sample_rate, hop_size)
21
- @params = params
22
-
23
- check_for_valid_audio_source(path)
24
- end
25
-
26
- def close
27
- Api.del_aubio_source(@source)
28
- @is_closed = true
29
- end
30
-
31
- def onsets
32
- check_for_closed
33
-
34
- Onsets.new(@source, @params).each
35
- end
36
-
37
- def pitches
38
- check_for_closed
39
-
40
- Pitches.new(@source, @params).each
41
- end
42
-
43
- def beats
44
- check_for_closed
45
-
46
- Beats.new(@source, @params).each
47
- end
48
-
49
- def bpm
50
- check_for_closed
51
-
52
- beat_locations = Beats.new(@source, @params).each.to_a
53
- beat_periods = beat_locations.each_cons(2).map {|a,b| b[:s] - a[:s] }
54
-
55
- return 60.0 if beat_locations.length == 1
56
-
57
- # use interquartile median to discourage outliers
58
- s = beat_periods.length
59
- qrt_lower_idx = (s/4.0).floor
60
- qrt_upper_idx = qrt_lower_idx * 3
61
- interquartile_beat_periods = beat_periods[qrt_lower_idx..qrt_upper_idx]
62
-
63
- # Calculate median
64
- iqs = interquartile_beat_periods.length
65
-
66
- iq_median_beat_period = interquartile_beat_periods.sort[(iqs/2.0).floor() - 1]
67
- 60.0 / iq_median_beat_period
68
- end
69
-
70
- private
71
- def check_for_closed
72
- raise AlreadyClosed if @is_closed
73
- end
74
-
75
- def check_for_valid_audio_source(path)
76
- begin
77
- @source.read_pointer
78
- rescue FFI::NullPointerError
79
- raise InvalidAudioInput.new(%Q{
80
-
81
- Couldn't read file at #{path}
82
- Did you install aubio with libsndfile support?
83
- })
84
- end
85
- end
86
- end
87
- end
88
-
89
- module Aubio
90
- def self.open(path, params = {})
91
- Base.new(path, params)
92
- end
93
- end