feep 0.1.2 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/Gemfile.lock +20 -19
- data/README.md +6 -4
- data/bin/feep +24 -14
- data/feep.gemspec +30 -30
- data/lib/feep/constants.rb +257 -257
- data/lib/feep/scale.rb +3 -3
- data/lib/feep/sound_player.rb +7 -7
- data/lib/feep/version.rb +3 -3
- data/spec/feep_spec.rb +1 -1
- metadata +12 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 59543cefdd37f6d8096b1ddc2cffc002f29feb400959fd151666b9b5840db475
|
4
|
+
data.tar.gz: f93bc3597f9b124022df28392a3b2d0a95a662c78a486d5585757c334befbf09
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d142fd388e4795be9ddb531622abac78c834c12e4ab771a1e2e24cd844bddf087cbc99208a25043f3a54e2abc8a1d0799981c7beebf687e19afa5361fc207529
|
7
|
+
data.tar.gz: 79c1faa0adc9dd6e88b3d3b0e0e3d7a392b53dab7dba833f409e0f456910a79fce710511ebf7377aec1cd4963de7ab31cfdc2c694d8eeb1f908bb8e9ac243a77
|
data/Gemfile.lock
CHANGED
@@ -1,16 +1,14 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
feep (0.
|
4
|
+
feep (0.2.1)
|
5
5
|
os (~> 0.9, >= 0.9.6)
|
6
6
|
wavefile (= 0.6.0)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
ast (2.
|
12
|
-
astrolabe (1.3.0)
|
13
|
-
parser (>= 2.2.0.pre.3, < 3.0)
|
11
|
+
ast (2.3.0)
|
14
12
|
byebug (3.5.1)
|
15
13
|
columnize (~> 0.8)
|
16
14
|
debugger-linecache (~> 1.2)
|
@@ -21,9 +19,10 @@ GEM
|
|
21
19
|
diff-lcs (1.2.5)
|
22
20
|
method_source (0.8.2)
|
23
21
|
os (0.9.6)
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
parallel (1.12.1)
|
23
|
+
parser (2.4.0.2)
|
24
|
+
ast (~> 2.3)
|
25
|
+
powerpack (0.1.1)
|
27
26
|
pry (0.10.1)
|
28
27
|
coderay (~> 1.1.0)
|
29
28
|
method_source (~> 0.8.1)
|
@@ -36,8 +35,8 @@ GEM
|
|
36
35
|
pry-byebug (3.0.1)
|
37
36
|
byebug (~> 3.4)
|
38
37
|
pry (~> 0.10)
|
39
|
-
rainbow (
|
40
|
-
rake (
|
38
|
+
rainbow (3.0.0)
|
39
|
+
rake (12.3.3)
|
41
40
|
rspec (3.2.0)
|
42
41
|
rspec-core (~> 3.2.0)
|
43
42
|
rspec-expectations (~> 3.2.0)
|
@@ -51,14 +50,16 @@ GEM
|
|
51
50
|
diff-lcs (>= 1.2.0, < 2.0)
|
52
51
|
rspec-support (~> 3.2.0)
|
53
52
|
rspec-support (3.2.2)
|
54
|
-
rubocop (0.
|
55
|
-
|
56
|
-
parser (>= 2.
|
53
|
+
rubocop (0.52.1)
|
54
|
+
parallel (~> 1.10)
|
55
|
+
parser (>= 2.4.0.2, < 3.0)
|
57
56
|
powerpack (~> 0.1)
|
58
|
-
rainbow (>=
|
59
|
-
ruby-progressbar (~> 1.
|
60
|
-
|
57
|
+
rainbow (>= 2.2.2, < 4.0)
|
58
|
+
ruby-progressbar (~> 1.7)
|
59
|
+
unicode-display_width (~> 1.0, >= 1.0.1)
|
60
|
+
ruby-progressbar (1.9.0)
|
61
61
|
slop (3.6.0)
|
62
|
+
unicode-display_width (1.3.0)
|
62
63
|
wavefile (0.6.0)
|
63
64
|
win32console (1.3.2)
|
64
65
|
|
@@ -67,12 +68,12 @@ PLATFORMS
|
|
67
68
|
x64-mingw32
|
68
69
|
|
69
70
|
DEPENDENCIES
|
70
|
-
bundler (~>
|
71
|
+
bundler (~> 2.0)
|
71
72
|
feep!
|
72
73
|
pry-byebug (~> 3.0)
|
73
|
-
rake (~>
|
74
|
+
rake (~> 12.0)
|
74
75
|
rspec (~> 3.0)
|
75
|
-
rubocop (~> 0.
|
76
|
+
rubocop (~> 0.52.1)
|
76
77
|
|
77
78
|
BUNDLED WITH
|
78
|
-
1.
|
79
|
+
2.1.4
|
data/README.md
CHANGED
@@ -2,9 +2,9 @@
|
|
2
2
|
[![Gem Version](https://badge.fury.io/rb/feep.svg)](http://badge.fury.io/rb/feep)
|
3
3
|
|
4
4
|
## Wha?
|
5
|
-
Use the power of Ruby gems to make your computer [feep](http://dictionary.reference.com/browse/feep) (except more musically) using sweet [WAV-file-writing technology](http://wavefilegem.com) from [Joel Strait](https://github.com/jstrait). Works on both Windows and
|
5
|
+
Use the power of Ruby gems to make your computer [feep](http://dictionary.reference.com/browse/feep) (except more musically) using sweet [WAV-file-writing technology](http://wavefilegem.com) from [Joel Strait](https://github.com/jstrait). Works on both Windows and \*nix (including OS X) as it uses the standard WAV format to do its bidding.
|
6
6
|
|
7
|
-
_Note:_ In order for the sound-playing magic to work on Windows, you will need [sounder](http://www.elifulkerson.com/projects/commandline-wav-player.php), a free command-line WAV file player on your system and in your path. Mac and
|
7
|
+
_Note:_ In order for the sound-playing magic to work on Windows, you will need [sounder](http://www.elifulkerson.com/projects/commandline-wav-player.php), a free command-line WAV file player on your system and in your path. Mac and \*nix uses `afplay`, which should be built-in, but feel free to change either to something you already have or desire to install.
|
8
8
|
|
9
9
|
## Why?
|
10
10
|
|
@@ -18,7 +18,7 @@ Feep doesn't require any parameters, as it will play a 440Hz/A4 sine wave at 50%
|
|
18
18
|
|
19
19
|
The full usage looks like this:
|
20
20
|
|
21
|
-
`feep [-f, --frequency FREQUENCY] [-n, --note NOTE_NAME] [-s, --scale SCALE_ID] [--degrees SCALE_DEGREES] [-w, --waveform WAVEFORM_ID] [-a, --amplitude MAX_AMPLITUDE] [-d, --duration DURATION] [--save] [--
|
21
|
+
`feep [-f, --frequency FREQUENCY] [-n, --note NOTE_NAME] [-s, --scale SCALE_ID] [--degrees SCALE_DEGREES] [-w, --waveform WAVEFORM_ID] [-a, --amplitude MAX_AMPLITUDE] [-d, --duration DURATION] [--save] [--verbose] [--visual_cue]`
|
22
22
|
|
23
23
|
`-f, --frequency, -n, --note`: a number from 0 to 20000, or a valid note name from C0 to B9 (including sharps and flats). Both `-f|--frequency` and `-n|--note` parameters can take either kind; they're both supported mainly for ease of use. You can try a frequency outside of this range, but you may get odd results. You may also enter some combination of these with commas between them and it'll play all of them together in a chord.
|
24
24
|
|
@@ -34,7 +34,9 @@ The full usage looks like this:
|
|
34
34
|
|
35
35
|
`--save`: switch to save the resulting WAV file in the current directory. Will create it in the format of `waveform_frequency-in-Hz_volume_duration.wav`.
|
36
36
|
|
37
|
-
`--
|
37
|
+
`--verbose`: switch that displays note and file-making information.
|
38
|
+
|
39
|
+
`--visual_cue`: switch that display a cute "Feep!" message, the length of which determined by the duration of the feep.
|
38
40
|
|
39
41
|
## Examples
|
40
42
|
|
data/bin/feep
CHANGED
@@ -1,33 +1,43 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'optparse'
|
4
|
-
require 'pry'
|
5
4
|
|
6
5
|
require_relative '../lib/feep'
|
7
6
|
require_relative '../lib/feep/version'
|
8
7
|
|
9
8
|
def parse_options
|
10
|
-
options = {
|
9
|
+
options = {
|
10
|
+
:freq_or_note => '440.000',
|
11
|
+
:scale => nil,
|
12
|
+
:waveform => 'sine',
|
13
|
+
:volume => 0.5,
|
14
|
+
:duration => 100,
|
15
|
+
:save => false,
|
16
|
+
:verbose => false,
|
17
|
+
:visual_cue => false,
|
18
|
+
:usage => nil
|
19
|
+
}
|
11
20
|
|
12
21
|
optparse = OptionParser.new do |opts|
|
13
|
-
opts.banner =
|
22
|
+
opts.banner = "Play sounds on the command line\n"
|
23
|
+
opts.banner += "usage: feep [-f, -n, --frequency, --note FREQUENCY|NOTE_NAME] [-s, --scale SCALE_ID] [-sd, --degrees NUMBER_OF_SCALE_DEGREES] [-w, --waveform WAVEFORM_ID] [-a, --amplitude MAX_AMPLITUDE] [-d, --duration DURATION] [--save] [--verbose] [--visual_cue]\n\n"
|
14
24
|
|
15
25
|
opts.on('-f', '--frequency FREQUENCY', 'One or more frequencies or to play at once, e.g. 440 or 220,440,880') do |frequency|
|
16
26
|
options[:freq_or_note] = frequency
|
17
27
|
end
|
18
|
-
|
28
|
+
|
19
29
|
opts.on('-n', '--note NOTE_NAME', 'One or more note names to play at once, e.g. A4 or A4,C5,E5') do |note|
|
20
30
|
options[:freq_or_note] = note
|
21
31
|
end
|
22
|
-
|
32
|
+
|
23
33
|
opts.on('-s', '--scale SCALE_ID', 'Name of a scale to play') do |scale_id|
|
24
34
|
options[:scale] = scale_id
|
25
35
|
end
|
26
|
-
|
36
|
+
|
27
37
|
opts.on('--degrees SCALE_DEGREES', 'Number of degrees of the scale to play') do |degrees|
|
28
38
|
options[:degrees] = degrees
|
29
39
|
end
|
30
|
-
|
40
|
+
|
31
41
|
opts.on('-w', '--waveform WAVEFORM', 'Waveform type to use for the sound') do |waveform|
|
32
42
|
options[:waveform] = waveform
|
33
43
|
end
|
@@ -35,7 +45,7 @@ def parse_options
|
|
35
45
|
opts.on('-a', '--amplitude MAX_AMPLITUDE', 'Amplitude/volume (0.0 - 1.0) to play the sound(s) at') do |amplitude|
|
36
46
|
options[:volume] = amplitude.to_f
|
37
47
|
end
|
38
|
-
|
48
|
+
|
39
49
|
opts.on('-d', '--duration DURATION', 'Duration in ms to play the sound(s)') do |duration|
|
40
50
|
options[:duration] = duration.to_i
|
41
51
|
end
|
@@ -43,13 +53,13 @@ def parse_options
|
|
43
53
|
opts.on('--save', 'Save the resulting WAV file in the current directory') do
|
44
54
|
options[:save] = true
|
45
55
|
end
|
46
|
-
|
47
|
-
opts.on('--
|
48
|
-
options[:
|
56
|
+
|
57
|
+
opts.on('--verbose', 'Displays information about note(s) being played') do
|
58
|
+
options[:verbose] = true
|
49
59
|
end
|
50
|
-
|
51
|
-
opts.on('--
|
52
|
-
options[:
|
60
|
+
|
61
|
+
opts.on('--visual_cue', 'Display "Feeep!" text on play') do
|
62
|
+
options[:visual_cue] = true
|
53
63
|
end
|
54
64
|
|
55
65
|
opts.on('-v', '--version', 'Display version number and exit') do
|
data/feep.gemspec
CHANGED
@@ -1,30 +1,30 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'feep/version'
|
5
|
-
|
6
|
-
Gem::Specification.new do |spec|
|
7
|
-
spec.name = 'feep'
|
8
|
-
spec.version = Feep::VERSION
|
9
|
-
spec.platform = Gem::Platform::RUBY
|
10
|
-
spec.authors = ['Michael Chadwick']
|
11
|
-
spec.email = 'mike@codana.me'
|
12
|
-
spec.homepage = 'http://rubygems.org/gems/feep'
|
13
|
-
spec.summary = 'Make your computer feep with Ruby'
|
14
|
-
spec.description = 'Use Ruby to make your computer beep at a certain frequency for a certain duration. Do it for fun, or add it to other programs for easy alert sounds.'
|
15
|
-
|
16
|
-
spec.files = `git ls-files`.split("\n")
|
17
|
-
spec.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
-
spec.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
19
|
-
spec.require_paths = ['lib']
|
20
|
-
spec.license = 'MIT'
|
21
|
-
|
22
|
-
spec.add_runtime_dependency 'wavefile', '= 0.6.0'
|
23
|
-
spec.add_runtime_dependency 'os', '~> 0.9', '>= 0.9.6'
|
24
|
-
|
25
|
-
spec.add_development_dependency 'pry-byebug', '~> 3.0'
|
26
|
-
spec.add_development_dependency 'bundler', '~>
|
27
|
-
spec.add_development_dependency 'rake', '~>
|
28
|
-
spec.add_development_dependency 'rspec', '~> 3.0'
|
29
|
-
spec.add_development_dependency 'rubocop', '~> 0.
|
30
|
-
end
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'feep/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'feep'
|
8
|
+
spec.version = Feep::VERSION
|
9
|
+
spec.platform = Gem::Platform::RUBY
|
10
|
+
spec.authors = ['Michael Chadwick']
|
11
|
+
spec.email = 'mike@codana.me'
|
12
|
+
spec.homepage = 'http://rubygems.org/gems/feep'
|
13
|
+
spec.summary = 'Make your computer feep with Ruby'
|
14
|
+
spec.description = 'Use Ruby to make your computer beep at a certain frequency for a certain duration. Do it for fun, or add it to other programs for easy alert sounds.'
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split("\n")
|
17
|
+
spec.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
spec.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
spec.license = 'MIT'
|
21
|
+
|
22
|
+
spec.add_runtime_dependency 'wavefile', '= 0.6.0'
|
23
|
+
spec.add_runtime_dependency 'os', '~> 0.9', '>= 0.9.6'
|
24
|
+
|
25
|
+
spec.add_development_dependency 'pry-byebug', '~> 3.0'
|
26
|
+
spec.add_development_dependency 'bundler', '~> 2.0'
|
27
|
+
spec.add_development_dependency 'rake', '~> 12.0'
|
28
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
29
|
+
spec.add_development_dependency 'rubocop', '~> 0.52.1'
|
30
|
+
end
|
data/lib/feep/constants.rb
CHANGED
@@ -1,257 +1,257 @@
|
|
1
|
-
# lib/feep/constants.rb
|
2
|
-
|
3
|
-
module Feep
|
4
|
-
# constants
|
5
|
-
SNDPLAYER_WIN = 'sounder.exe'
|
6
|
-
SNDPLAYER_UNIX = 'afplay'
|
7
|
-
SAMPLE_RATE = 44100
|
8
|
-
TWO_PI = 2 * Math::PI
|
9
|
-
RANDOM_GENERATOR = Random.new
|
10
|
-
WAVE_TYPES = %w[sine square saw triangle noise]
|
11
|
-
|
12
|
-
# tables of musical data
|
13
|
-
SCALES = Hash[
|
14
|
-
:chromatic => '1,1,1,1,1,1,1,1,1,1,1,1,1',
|
15
|
-
:whole_tone => '2,2,2,2,2,2,2',
|
16
|
-
:major => '2,2,2,1,2,2,2,1',
|
17
|
-
:minor_harm => '2,1,2,2,1,3,3',
|
18
|
-
:minor_melodic => '2,1,2,2,2,2,3',
|
19
|
-
:major_pentatonic => '2,2,3,2,3,2',
|
20
|
-
:minor_pentatonic => '3,2,2,3,2,3',
|
21
|
-
:blues => '3,2,1,1,3,2,3',
|
22
|
-
:phyrgian => '1,2,2,2,1,2,2,2',
|
23
|
-
:dorian => '2,1,2,2,2,1,2,2'
|
24
|
-
]
|
25
|
-
NOTES = Array[
|
26
|
-
'C0','C#0','D0','D#0','E0','F0','F#0','G0','G#0','A0','A#0','B0',
|
27
|
-
'C1','C#1','D1','D#1','E1','F1','F#1','G1','G#1','A1','A#1','B1',
|
28
|
-
'C2','C#2','D2','D#2','E2','F2','F#2','G2','G#2','A2','A#2','B2',
|
29
|
-
'C3','C#3','D3','D#3','E3','F3','F#3','G3','G#3','A3','A#3','B3',
|
30
|
-
'C4','C#4','D4','D#4','E4','F4','F#4','G4','G#4','A4','A#4','B4',
|
31
|
-
'C5','C#5','D5','D#5','E5','F5','F#5','G5','G#5','A5','A#5','B5',
|
32
|
-
'C6','C#6','D6','D#6','E6','F6','F#6','G6','G#6','A6','A#6','B6',
|
33
|
-
'C7','C#7','D7','D#7','E7','F7','F#7','G7','G#7','A7','A#7','B7',
|
34
|
-
'C8','C#8','D8','D#8','E8','F8','F#8','G8','G#8','A8','A#8','B8',
|
35
|
-
'C9','C#9','D9','D#9','E9','F9','F#9','G9','G#9','A9','A#9','B9'
|
36
|
-
]
|
37
|
-
NOTES_ALT = Array[
|
38
|
-
'C0','Db0','D0','Eb0','E0','F0','Gb0','G0','Ab0','A0','Bb0','B0',
|
39
|
-
'C1','Db1','D1','Eb1','E1','F1','Gb1','G1','Ab1','A1','Bb1','B1',
|
40
|
-
'C2','Db2','D2','Eb2','E2','F2','Gb2','G2','Ab2','A2','Bb2','B2',
|
41
|
-
'C3','Db3','D3','Eb3','E3','F3','Gb3','G3','Ab3','A3','Bb3','B3',
|
42
|
-
'C4','Db4','D4','Eb4','E4','F4','Gb4','G4','Ab4','A4','Bb4','B4',
|
43
|
-
'C5','Db5','D5','Eb5','E5','F5','Gb5','G5','Ab5','A5','Bb5','B5',
|
44
|
-
'C6','Db6','D6','Eb6','E6','F6','Gb6','G6','Ab6','A6','Bb6','B6',
|
45
|
-
'C7','Db7','D7','Eb7','E7','F7','Gb7','G7','Ab7','A7','Bb7','B7',
|
46
|
-
'C8','Db8','D8','Eb8','E8','F8','Gb8','G8','Ab8','A8','Bb8','B8',
|
47
|
-
'C9','Db9','D9','Eb9','E9','F9','Gb9','G9','Ab9','A9','Bb9','B9'
|
48
|
-
]
|
49
|
-
|
50
|
-
FREQS = Array[
|
51
|
-
16.351,17.324,18.354,19.445,20.601,21.827,23.124,24.499,25.956,27.500,29.135,30.868,
|
52
|
-
32.703,34.648,36.708,38.891,41.203,43.654,46.249,48.999,51.913,55.000,58.270,61.375,
|
53
|
-
65.406,69.296,73.416,77.782,82.407,87.307,92.499,97.999,103.826,110.000,116.541,
|
54
|
-
123.471,130.813,138.591,146.832,155.564,164.814,174.614,184.997,195.998,207.652,220.000,233.082,246.942,
|
55
|
-
261.626,277.183,293.665,311.127,329.628,349.228,369.994,391.995,415.305,440.000,466.164,493.883,
|
56
|
-
523.251,554.365,587.330,622.254,659.255,698.457,739.989,783.991,830.609,880.000,932.328,987.767,
|
57
|
-
1046.502,1108.731,1174.659,1244.508,1318.510,1396.913,1479.978,1567.982,1661.219,1760.000,1864.655,1975.533,
|
58
|
-
2093.005,2217.461,2349.318,2489.016,2637.021,2793.826,2959.956,3135.964,3322.438,3520.000,3729.310,3951.066,
|
59
|
-
4186.009,4434.922,4698.636,4978.032,5274.042,5587.652,5919.910,6271.928,6644.876,7040.000,7458.620,7902.132,
|
60
|
-
8372.018,8869.844,9397.272,9956.064,10548.084,11175.304,11839.820,12543.856,13289.752,14080.000,14917.240,15804.264
|
61
|
-
]
|
62
|
-
|
63
|
-
MIDIS = Array[
|
64
|
-
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
|
65
|
-
24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
|
66
|
-
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
|
67
|
-
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
|
68
|
-
60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
|
69
|
-
72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
|
70
|
-
84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
|
71
|
-
96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
|
72
|
-
108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
|
73
|
-
120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131
|
74
|
-
]
|
75
|
-
|
76
|
-
NOTE_FREQ = Hash[
|
77
|
-
'C0' => 16.351,
|
78
|
-
'C#0' => 17.324,
|
79
|
-
'Db0' => 17.324,
|
80
|
-
'D0' => 18.354,
|
81
|
-
'D#0' => 19.445,
|
82
|
-
'Eb0' => 19.445,
|
83
|
-
'E0' => 20.601,
|
84
|
-
'F0' => 21.827,
|
85
|
-
'F#0' => 23.124,
|
86
|
-
'Gb0' => 23.124,
|
87
|
-
'G0' => 24.499,
|
88
|
-
'G#0' => 25.956,
|
89
|
-
'Ab0' => 25.956,
|
90
|
-
'A0' => 27.500,
|
91
|
-
'A#0' => 29.135,
|
92
|
-
'Bb0' => 29.135,
|
93
|
-
'B0' => 30.868,
|
94
|
-
'C1' => 32.703,
|
95
|
-
'C#1' => 34.648,
|
96
|
-
'Db1' => 34.648,
|
97
|
-
'D1' => 36.708,
|
98
|
-
'D#1' => 38.891,
|
99
|
-
'Eb1' => 38.891,
|
100
|
-
'E1' => 41.203,
|
101
|
-
'F1' => 43.654,
|
102
|
-
'F#1' => 46.249,
|
103
|
-
'Gb1' => 46.249,
|
104
|
-
'G1' => 48.999,
|
105
|
-
'G#1' => 51.913,
|
106
|
-
'Ab1' => 51.913,
|
107
|
-
'A1' => 55.000,
|
108
|
-
'A#1' => 58.270,
|
109
|
-
'Bb1' => 58.270,
|
110
|
-
'B1' => 61.375,
|
111
|
-
'C2' => 65.406,
|
112
|
-
'C#2' => 69.296,
|
113
|
-
'Db2' => 69.296,
|
114
|
-
'D2' => 73.416,
|
115
|
-
'D#2' => 77.782,
|
116
|
-
'Eb2' => 77.782,
|
117
|
-
'E2' => 82.407,
|
118
|
-
'F2' => 87.307,
|
119
|
-
'F#2' => 92.499,
|
120
|
-
'Gb2' => 92.499,
|
121
|
-
'G2' => 97.999,
|
122
|
-
'G#2' => 97.999,
|
123
|
-
'Ab2' => 103.826,
|
124
|
-
'A2' => 110.000,
|
125
|
-
'A#2' => 116.541,
|
126
|
-
'Bb2' => 116.541,
|
127
|
-
'B2' => 123.471,
|
128
|
-
'C3' => 130.813,
|
129
|
-
'C#3' => 138.591,
|
130
|
-
'Db3' => 138.591,
|
131
|
-
'D3' => 146.832,
|
132
|
-
'D#3' => 155.564,
|
133
|
-
'Eb3' => 155.564,
|
134
|
-
'E3' => 164.814,
|
135
|
-
'F3' => 174.614,
|
136
|
-
'F#3' => 184.997,
|
137
|
-
'Gb3' => 184.997,
|
138
|
-
'G3' => 195.998,
|
139
|
-
'G#3' => 207.652,
|
140
|
-
'Ab3' => 207.652,
|
141
|
-
'A3' => 220.000,
|
142
|
-
'A#3' => 233.082,
|
143
|
-
'Bb3' => 233.082,
|
144
|
-
'B3' => 246.942,
|
145
|
-
'C4' => 261.626,
|
146
|
-
'C#4' => 277.183,
|
147
|
-
'Db4' => 277.183,
|
148
|
-
'D4' => 293.665,
|
149
|
-
'D#4' => 311.127,
|
150
|
-
'Eb4' => 311.127,
|
151
|
-
'E4' => 329.628,
|
152
|
-
'F4' => 349.228,
|
153
|
-
'F#4' => 369.994,
|
154
|
-
'Gb4' => 369.994,
|
155
|
-
'G4' => 391.995,
|
156
|
-
'G#4' => 415.305,
|
157
|
-
'Ab4' => 415.305,
|
158
|
-
'A4' => 440.000,
|
159
|
-
'A#4' => 466.164,
|
160
|
-
'Bb4' => 466.164,
|
161
|
-
'B4' => 493.883,
|
162
|
-
'C5' => 523.251,
|
163
|
-
'C#5' => 554.365,
|
164
|
-
'Db5' => 554.365,
|
165
|
-
'D5' => 587.330,
|
166
|
-
'D#5' => 622.254,
|
167
|
-
'Eb5' => 622.254,
|
168
|
-
'E5' => 659.255,
|
169
|
-
'F5' => 698.457,
|
170
|
-
'F#5' => 739.989,
|
171
|
-
'Gb5' => 739.989,
|
172
|
-
'G5' => 783.991,
|
173
|
-
'G#5' => 830.609,
|
174
|
-
'Ab5' => 830.609,
|
175
|
-
'A5' => 880.000,
|
176
|
-
'A#5' => 932.328,
|
177
|
-
'Bb5' => 932.328,
|
178
|
-
'B5' => 987.767,
|
179
|
-
'C6' => 1046.502,
|
180
|
-
'C#6' => 1108.731,
|
181
|
-
'Db6' => 1108.731,
|
182
|
-
'D6' => 1174.659,
|
183
|
-
'D#6' => 1244.508,
|
184
|
-
'Eb6' => 1244.508,
|
185
|
-
'E6' => 1318.510,
|
186
|
-
'F6' => 1396.913,
|
187
|
-
'F#6' => 1479.978,
|
188
|
-
'Gb6' => 1479.978,
|
189
|
-
'G6' => 1567.982,
|
190
|
-
'G#6' => 1661.219,
|
191
|
-
'Ab6' => 1661.219,
|
192
|
-
'A6' => 1760.000,
|
193
|
-
'A#6' => 1864.655,
|
194
|
-
'Bb6' => 1864.655,
|
195
|
-
'B6' => 1975.533,
|
196
|
-
'C7' => 2093.005,
|
197
|
-
'C#7' => 2217.461,
|
198
|
-
'Db7' => 2217.461,
|
199
|
-
'D7' => 2349.318,
|
200
|
-
'D#7' => 2489.016,
|
201
|
-
'Eb7' => 2489.016,
|
202
|
-
'E7' => 2637.021,
|
203
|
-
'F7' => 2793.826,
|
204
|
-
'F#7' => 2959.956,
|
205
|
-
'Gb7' => 2959.956,
|
206
|
-
'G7' => 3135.964,
|
207
|
-
'G#7' => 3322.438,
|
208
|
-
'Ab7' => 3322.438,
|
209
|
-
'A7' => 3520.000,
|
210
|
-
'A#7' => 3729.310,
|
211
|
-
'Bb7' => 3729.310,
|
212
|
-
'B7' => 3951.066,
|
213
|
-
'C8' => 4186.009,
|
214
|
-
'C#8' => 4434.922,
|
215
|
-
'Db8' => 4434.922,
|
216
|
-
'D8' => 4698.636,
|
217
|
-
'D#8' => 4978.032,
|
218
|
-
'Eb8' => 4978.032,
|
219
|
-
'E8' => 5274.042,
|
220
|
-
'F8' => 5587.652,
|
221
|
-
'F#8' => 5919.910,
|
222
|
-
'Gb8' => 5919.910,
|
223
|
-
'G8' => 6271.928,
|
224
|
-
'G#8' => 6644.876,
|
225
|
-
'Ab8' => 6644.876,
|
226
|
-
'A8' => 7040.000,
|
227
|
-
'A#8' => 7458.620,
|
228
|
-
'Bb8' => 7458.620,
|
229
|
-
'B8' => 7902.132,
|
230
|
-
'C9' => 8372.018,
|
231
|
-
'C#9' => 8869.844,
|
232
|
-
'Db9' => 8869.844,
|
233
|
-
'D9' => 9397.272,
|
234
|
-
'D#9' => 9956.064,
|
235
|
-
'Eb9' => 9956.064,
|
236
|
-
'E9' => 10548.084,
|
237
|
-
'F9' => 11175.304,
|
238
|
-
'F#9' => 11839.820,
|
239
|
-
'Gb9' => 11839.820,
|
240
|
-
'G9' => 12543.856,
|
241
|
-
'G#9' => 13289.752,
|
242
|
-
'Ab9' => 13289.752,
|
243
|
-
'A9' => 14080.000,
|
244
|
-
'A#9' => 14917.240,
|
245
|
-
'Bb9' => 14917.240,
|
246
|
-
'B9' => 15804.264
|
247
|
-
]
|
248
|
-
|
249
|
-
# error messages
|
250
|
-
ERROR_MSG = Hash[
|
251
|
-
:invalid_note => 'Note name argument is invalid.',
|
252
|
-
:invalid_scale => "Scale ID is invalid. Valid IDs are: #{SCALES.keys}",
|
253
|
-
:invalid_scale_root_note => 'Scale cannot start with that note/frequency.',
|
254
|
-
:invalid_waveform => "Waveform type is invalid. Valid waveform types are: #{WAVE_TYPES}",
|
255
|
-
:scale_needs_note => 'You need to enter a valid note (-n) if you want to play a scale.'
|
256
|
-
]
|
257
|
-
end
|
1
|
+
# lib/feep/constants.rb
|
2
|
+
|
3
|
+
module Feep
|
4
|
+
# constants
|
5
|
+
SNDPLAYER_WIN = 'sounder.exe'
|
6
|
+
SNDPLAYER_UNIX = 'afplay'
|
7
|
+
SAMPLE_RATE = 44100
|
8
|
+
TWO_PI = 2 * Math::PI
|
9
|
+
RANDOM_GENERATOR = Random.new
|
10
|
+
WAVE_TYPES = %w[sine square saw triangle noise]
|
11
|
+
|
12
|
+
# tables of musical data
|
13
|
+
SCALES = Hash[
|
14
|
+
:chromatic => '1,1,1,1,1,1,1,1,1,1,1,1,1',
|
15
|
+
:whole_tone => '2,2,2,2,2,2,2',
|
16
|
+
:major => '2,2,2,1,2,2,2,1',
|
17
|
+
:minor_harm => '2,1,2,2,1,3,3',
|
18
|
+
:minor_melodic => '2,1,2,2,2,2,3',
|
19
|
+
:major_pentatonic => '2,2,3,2,3,2',
|
20
|
+
:minor_pentatonic => '3,2,2,3,2,3',
|
21
|
+
:blues => '3,2,1,1,3,2,3',
|
22
|
+
:phyrgian => '1,2,2,2,1,2,2,2',
|
23
|
+
:dorian => '2,1,2,2,2,1,2,2'
|
24
|
+
]
|
25
|
+
NOTES = Array[
|
26
|
+
'C0','C#0','D0','D#0','E0','F0','F#0','G0','G#0','A0','A#0','B0',
|
27
|
+
'C1','C#1','D1','D#1','E1','F1','F#1','G1','G#1','A1','A#1','B1',
|
28
|
+
'C2','C#2','D2','D#2','E2','F2','F#2','G2','G#2','A2','A#2','B2',
|
29
|
+
'C3','C#3','D3','D#3','E3','F3','F#3','G3','G#3','A3','A#3','B3',
|
30
|
+
'C4','C#4','D4','D#4','E4','F4','F#4','G4','G#4','A4','A#4','B4',
|
31
|
+
'C5','C#5','D5','D#5','E5','F5','F#5','G5','G#5','A5','A#5','B5',
|
32
|
+
'C6','C#6','D6','D#6','E6','F6','F#6','G6','G#6','A6','A#6','B6',
|
33
|
+
'C7','C#7','D7','D#7','E7','F7','F#7','G7','G#7','A7','A#7','B7',
|
34
|
+
'C8','C#8','D8','D#8','E8','F8','F#8','G8','G#8','A8','A#8','B8',
|
35
|
+
'C9','C#9','D9','D#9','E9','F9','F#9','G9','G#9','A9','A#9','B9'
|
36
|
+
]
|
37
|
+
NOTES_ALT = Array[
|
38
|
+
'C0','Db0','D0','Eb0','E0','F0','Gb0','G0','Ab0','A0','Bb0','B0',
|
39
|
+
'C1','Db1','D1','Eb1','E1','F1','Gb1','G1','Ab1','A1','Bb1','B1',
|
40
|
+
'C2','Db2','D2','Eb2','E2','F2','Gb2','G2','Ab2','A2','Bb2','B2',
|
41
|
+
'C3','Db3','D3','Eb3','E3','F3','Gb3','G3','Ab3','A3','Bb3','B3',
|
42
|
+
'C4','Db4','D4','Eb4','E4','F4','Gb4','G4','Ab4','A4','Bb4','B4',
|
43
|
+
'C5','Db5','D5','Eb5','E5','F5','Gb5','G5','Ab5','A5','Bb5','B5',
|
44
|
+
'C6','Db6','D6','Eb6','E6','F6','Gb6','G6','Ab6','A6','Bb6','B6',
|
45
|
+
'C7','Db7','D7','Eb7','E7','F7','Gb7','G7','Ab7','A7','Bb7','B7',
|
46
|
+
'C8','Db8','D8','Eb8','E8','F8','Gb8','G8','Ab8','A8','Bb8','B8',
|
47
|
+
'C9','Db9','D9','Eb9','E9','F9','Gb9','G9','Ab9','A9','Bb9','B9'
|
48
|
+
]
|
49
|
+
|
50
|
+
FREQS = Array[
|
51
|
+
16.351,17.324,18.354,19.445,20.601,21.827,23.124,24.499,25.956,27.500,29.135,30.868,
|
52
|
+
32.703,34.648,36.708,38.891,41.203,43.654,46.249,48.999,51.913,55.000,58.270,61.375,
|
53
|
+
65.406,69.296,73.416,77.782,82.407,87.307,92.499,97.999,103.826,110.000,116.541,
|
54
|
+
123.471,130.813,138.591,146.832,155.564,164.814,174.614,184.997,195.998,207.652,220.000,233.082,246.942,
|
55
|
+
261.626,277.183,293.665,311.127,329.628,349.228,369.994,391.995,415.305,440.000,466.164,493.883,
|
56
|
+
523.251,554.365,587.330,622.254,659.255,698.457,739.989,783.991,830.609,880.000,932.328,987.767,
|
57
|
+
1046.502,1108.731,1174.659,1244.508,1318.510,1396.913,1479.978,1567.982,1661.219,1760.000,1864.655,1975.533,
|
58
|
+
2093.005,2217.461,2349.318,2489.016,2637.021,2793.826,2959.956,3135.964,3322.438,3520.000,3729.310,3951.066,
|
59
|
+
4186.009,4434.922,4698.636,4978.032,5274.042,5587.652,5919.910,6271.928,6644.876,7040.000,7458.620,7902.132,
|
60
|
+
8372.018,8869.844,9397.272,9956.064,10548.084,11175.304,11839.820,12543.856,13289.752,14080.000,14917.240,15804.264
|
61
|
+
]
|
62
|
+
|
63
|
+
MIDIS = Array[
|
64
|
+
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
|
65
|
+
24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
|
66
|
+
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
|
67
|
+
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
|
68
|
+
60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
|
69
|
+
72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
|
70
|
+
84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
|
71
|
+
96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,
|
72
|
+
108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
|
73
|
+
120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131
|
74
|
+
]
|
75
|
+
|
76
|
+
NOTE_FREQ = Hash[
|
77
|
+
'C0' => 16.351,
|
78
|
+
'C#0' => 17.324,
|
79
|
+
'Db0' => 17.324,
|
80
|
+
'D0' => 18.354,
|
81
|
+
'D#0' => 19.445,
|
82
|
+
'Eb0' => 19.445,
|
83
|
+
'E0' => 20.601,
|
84
|
+
'F0' => 21.827,
|
85
|
+
'F#0' => 23.124,
|
86
|
+
'Gb0' => 23.124,
|
87
|
+
'G0' => 24.499,
|
88
|
+
'G#0' => 25.956,
|
89
|
+
'Ab0' => 25.956,
|
90
|
+
'A0' => 27.500,
|
91
|
+
'A#0' => 29.135,
|
92
|
+
'Bb0' => 29.135,
|
93
|
+
'B0' => 30.868,
|
94
|
+
'C1' => 32.703,
|
95
|
+
'C#1' => 34.648,
|
96
|
+
'Db1' => 34.648,
|
97
|
+
'D1' => 36.708,
|
98
|
+
'D#1' => 38.891,
|
99
|
+
'Eb1' => 38.891,
|
100
|
+
'E1' => 41.203,
|
101
|
+
'F1' => 43.654,
|
102
|
+
'F#1' => 46.249,
|
103
|
+
'Gb1' => 46.249,
|
104
|
+
'G1' => 48.999,
|
105
|
+
'G#1' => 51.913,
|
106
|
+
'Ab1' => 51.913,
|
107
|
+
'A1' => 55.000,
|
108
|
+
'A#1' => 58.270,
|
109
|
+
'Bb1' => 58.270,
|
110
|
+
'B1' => 61.375,
|
111
|
+
'C2' => 65.406,
|
112
|
+
'C#2' => 69.296,
|
113
|
+
'Db2' => 69.296,
|
114
|
+
'D2' => 73.416,
|
115
|
+
'D#2' => 77.782,
|
116
|
+
'Eb2' => 77.782,
|
117
|
+
'E2' => 82.407,
|
118
|
+
'F2' => 87.307,
|
119
|
+
'F#2' => 92.499,
|
120
|
+
'Gb2' => 92.499,
|
121
|
+
'G2' => 97.999,
|
122
|
+
'G#2' => 97.999,
|
123
|
+
'Ab2' => 103.826,
|
124
|
+
'A2' => 110.000,
|
125
|
+
'A#2' => 116.541,
|
126
|
+
'Bb2' => 116.541,
|
127
|
+
'B2' => 123.471,
|
128
|
+
'C3' => 130.813,
|
129
|
+
'C#3' => 138.591,
|
130
|
+
'Db3' => 138.591,
|
131
|
+
'D3' => 146.832,
|
132
|
+
'D#3' => 155.564,
|
133
|
+
'Eb3' => 155.564,
|
134
|
+
'E3' => 164.814,
|
135
|
+
'F3' => 174.614,
|
136
|
+
'F#3' => 184.997,
|
137
|
+
'Gb3' => 184.997,
|
138
|
+
'G3' => 195.998,
|
139
|
+
'G#3' => 207.652,
|
140
|
+
'Ab3' => 207.652,
|
141
|
+
'A3' => 220.000,
|
142
|
+
'A#3' => 233.082,
|
143
|
+
'Bb3' => 233.082,
|
144
|
+
'B3' => 246.942,
|
145
|
+
'C4' => 261.626,
|
146
|
+
'C#4' => 277.183,
|
147
|
+
'Db4' => 277.183,
|
148
|
+
'D4' => 293.665,
|
149
|
+
'D#4' => 311.127,
|
150
|
+
'Eb4' => 311.127,
|
151
|
+
'E4' => 329.628,
|
152
|
+
'F4' => 349.228,
|
153
|
+
'F#4' => 369.994,
|
154
|
+
'Gb4' => 369.994,
|
155
|
+
'G4' => 391.995,
|
156
|
+
'G#4' => 415.305,
|
157
|
+
'Ab4' => 415.305,
|
158
|
+
'A4' => 440.000,
|
159
|
+
'A#4' => 466.164,
|
160
|
+
'Bb4' => 466.164,
|
161
|
+
'B4' => 493.883,
|
162
|
+
'C5' => 523.251,
|
163
|
+
'C#5' => 554.365,
|
164
|
+
'Db5' => 554.365,
|
165
|
+
'D5' => 587.330,
|
166
|
+
'D#5' => 622.254,
|
167
|
+
'Eb5' => 622.254,
|
168
|
+
'E5' => 659.255,
|
169
|
+
'F5' => 698.457,
|
170
|
+
'F#5' => 739.989,
|
171
|
+
'Gb5' => 739.989,
|
172
|
+
'G5' => 783.991,
|
173
|
+
'G#5' => 830.609,
|
174
|
+
'Ab5' => 830.609,
|
175
|
+
'A5' => 880.000,
|
176
|
+
'A#5' => 932.328,
|
177
|
+
'Bb5' => 932.328,
|
178
|
+
'B5' => 987.767,
|
179
|
+
'C6' => 1046.502,
|
180
|
+
'C#6' => 1108.731,
|
181
|
+
'Db6' => 1108.731,
|
182
|
+
'D6' => 1174.659,
|
183
|
+
'D#6' => 1244.508,
|
184
|
+
'Eb6' => 1244.508,
|
185
|
+
'E6' => 1318.510,
|
186
|
+
'F6' => 1396.913,
|
187
|
+
'F#6' => 1479.978,
|
188
|
+
'Gb6' => 1479.978,
|
189
|
+
'G6' => 1567.982,
|
190
|
+
'G#6' => 1661.219,
|
191
|
+
'Ab6' => 1661.219,
|
192
|
+
'A6' => 1760.000,
|
193
|
+
'A#6' => 1864.655,
|
194
|
+
'Bb6' => 1864.655,
|
195
|
+
'B6' => 1975.533,
|
196
|
+
'C7' => 2093.005,
|
197
|
+
'C#7' => 2217.461,
|
198
|
+
'Db7' => 2217.461,
|
199
|
+
'D7' => 2349.318,
|
200
|
+
'D#7' => 2489.016,
|
201
|
+
'Eb7' => 2489.016,
|
202
|
+
'E7' => 2637.021,
|
203
|
+
'F7' => 2793.826,
|
204
|
+
'F#7' => 2959.956,
|
205
|
+
'Gb7' => 2959.956,
|
206
|
+
'G7' => 3135.964,
|
207
|
+
'G#7' => 3322.438,
|
208
|
+
'Ab7' => 3322.438,
|
209
|
+
'A7' => 3520.000,
|
210
|
+
'A#7' => 3729.310,
|
211
|
+
'Bb7' => 3729.310,
|
212
|
+
'B7' => 3951.066,
|
213
|
+
'C8' => 4186.009,
|
214
|
+
'C#8' => 4434.922,
|
215
|
+
'Db8' => 4434.922,
|
216
|
+
'D8' => 4698.636,
|
217
|
+
'D#8' => 4978.032,
|
218
|
+
'Eb8' => 4978.032,
|
219
|
+
'E8' => 5274.042,
|
220
|
+
'F8' => 5587.652,
|
221
|
+
'F#8' => 5919.910,
|
222
|
+
'Gb8' => 5919.910,
|
223
|
+
'G8' => 6271.928,
|
224
|
+
'G#8' => 6644.876,
|
225
|
+
'Ab8' => 6644.876,
|
226
|
+
'A8' => 7040.000,
|
227
|
+
'A#8' => 7458.620,
|
228
|
+
'Bb8' => 7458.620,
|
229
|
+
'B8' => 7902.132,
|
230
|
+
'C9' => 8372.018,
|
231
|
+
'C#9' => 8869.844,
|
232
|
+
'Db9' => 8869.844,
|
233
|
+
'D9' => 9397.272,
|
234
|
+
'D#9' => 9956.064,
|
235
|
+
'Eb9' => 9956.064,
|
236
|
+
'E9' => 10548.084,
|
237
|
+
'F9' => 11175.304,
|
238
|
+
'F#9' => 11839.820,
|
239
|
+
'Gb9' => 11839.820,
|
240
|
+
'G9' => 12543.856,
|
241
|
+
'G#9' => 13289.752,
|
242
|
+
'Ab9' => 13289.752,
|
243
|
+
'A9' => 14080.000,
|
244
|
+
'A#9' => 14917.240,
|
245
|
+
'Bb9' => 14917.240,
|
246
|
+
'B9' => 15804.264
|
247
|
+
]
|
248
|
+
|
249
|
+
# error messages
|
250
|
+
ERROR_MSG = Hash[
|
251
|
+
:invalid_note => 'Note name argument is invalid.',
|
252
|
+
:invalid_scale => "Scale ID is invalid. Valid IDs are: #{SCALES.keys}",
|
253
|
+
:invalid_scale_root_note => 'Scale cannot start with that note/frequency.',
|
254
|
+
:invalid_waveform => "Waveform type is invalid. Valid waveform types are: #{WAVE_TYPES}",
|
255
|
+
:scale_needs_note => 'You need to enter a valid note (-n) if you want to play a scale.'
|
256
|
+
]
|
257
|
+
end
|
data/lib/feep/scale.rb
CHANGED
@@ -27,18 +27,18 @@ module Feep
|
|
27
27
|
:volume => options[:volume],
|
28
28
|
:duration => options[:duration],
|
29
29
|
:save => options[:save],
|
30
|
-
:
|
30
|
+
:verbose => options[:verbose]
|
31
31
|
}
|
32
32
|
|
33
33
|
# play number of degrees of scale supplied or one octave by default
|
34
34
|
degrees = options[:degrees] || steps.length
|
35
35
|
|
36
|
-
if options[:
|
36
|
+
if options[:verbose]
|
37
37
|
puts "Playing a #{options[:scale]} scale..."
|
38
38
|
end
|
39
39
|
|
40
40
|
1.upto(degrees.to_i) {|deg|
|
41
|
-
if options[:
|
41
|
+
if options[:verbose]
|
42
42
|
puts "note: #{NOTE_FREQ.key(freq)}, freq: #{freq}"
|
43
43
|
end
|
44
44
|
|
data/lib/feep/sound_player.rb
CHANGED
@@ -7,22 +7,22 @@ module Feep
|
|
7
7
|
|
8
8
|
# main function that creates, plays, and removes note
|
9
9
|
def play_note(frequency, output_filename, samples_to_write, options)
|
10
|
-
if options[:
|
10
|
+
if options[:verbose]
|
11
11
|
puts 'Playing note'
|
12
12
|
puts " frequency: #{frequency.to_f.abs}"
|
13
13
|
puts " midi: #{Utils.freq_to_midi(frequency)}"
|
14
14
|
puts " duration: #{options[:duration]}"
|
15
15
|
end
|
16
16
|
SoundFile.new.create_sound(frequency, samples_to_write, output_filename, options)
|
17
|
-
play_wav_file(output_filename, options[:duration], options[:
|
17
|
+
play_wav_file(output_filename, options[:duration], options[:visual_cue])
|
18
18
|
remove_sound(output_filename, options)
|
19
19
|
end
|
20
20
|
|
21
21
|
# use command line app to play wav file
|
22
|
-
def play_wav_file(file, duration,
|
22
|
+
def play_wav_file(file, duration, visual_cue)
|
23
23
|
if OS.windows?
|
24
24
|
if command_exists?(SNDPLAYER_WIN)
|
25
|
-
display_text_beep(duration)
|
25
|
+
display_text_beep(duration) if visual_cue
|
26
26
|
system("#{SNDPLAYER_WIN} #{file}")
|
27
27
|
else
|
28
28
|
puts "couldn't find #{SNDPLAYER_WIN}"
|
@@ -31,7 +31,7 @@ module Feep
|
|
31
31
|
|
32
32
|
if OS.mac? || OS.linux?
|
33
33
|
if command_exists?(SNDPLAYER_UNIX)
|
34
|
-
display_text_beep(duration)
|
34
|
+
display_text_beep(duration) if visual_cue
|
35
35
|
system("#{SNDPLAYER_UNIX} #{file}")
|
36
36
|
else
|
37
37
|
puts "couldn't find #{SNDPLAYER_UNIX}"
|
@@ -50,7 +50,7 @@ module Feep
|
|
50
50
|
puts 'ep!'
|
51
51
|
end
|
52
52
|
|
53
|
-
# removes the sound, unless marked to save,
|
53
|
+
# removes the sound, unless marked to save,
|
54
54
|
# and optionally display info about file
|
55
55
|
def remove_sound(file, options)
|
56
56
|
unless options[:save]
|
@@ -60,7 +60,7 @@ module Feep
|
|
60
60
|
system("rm #{file}")
|
61
61
|
end
|
62
62
|
else
|
63
|
-
if options[:
|
63
|
+
if options[:verbose]
|
64
64
|
info = WaveFile::Reader.info(file)
|
65
65
|
duration = info.duration
|
66
66
|
formatted_duration = duration.minutes.to_s.rjust(2, '0') << ':' <<
|
data/lib/feep/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
module Feep
|
2
|
-
VERSION = '0.
|
3
|
-
end
|
1
|
+
module Feep
|
2
|
+
VERSION = '0.2.2'
|
3
|
+
end
|
data/spec/feep_spec.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: feep
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Chadwick
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-07-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: wavefile
|
@@ -64,28 +64,28 @@ dependencies:
|
|
64
64
|
requirements:
|
65
65
|
- - "~>"
|
66
66
|
- !ruby/object:Gem::Version
|
67
|
-
version: '
|
67
|
+
version: '2.0'
|
68
68
|
type: :development
|
69
69
|
prerelease: false
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
72
|
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version: '
|
74
|
+
version: '2.0'
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
76
|
name: rake
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
78
78
|
requirements:
|
79
79
|
- - "~>"
|
80
80
|
- !ruby/object:Gem::Version
|
81
|
-
version: '
|
81
|
+
version: '12.0'
|
82
82
|
type: :development
|
83
83
|
prerelease: false
|
84
84
|
version_requirements: !ruby/object:Gem::Requirement
|
85
85
|
requirements:
|
86
86
|
- - "~>"
|
87
87
|
- !ruby/object:Gem::Version
|
88
|
-
version: '
|
88
|
+
version: '12.0'
|
89
89
|
- !ruby/object:Gem::Dependency
|
90
90
|
name: rspec
|
91
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -106,14 +106,14 @@ dependencies:
|
|
106
106
|
requirements:
|
107
107
|
- - "~>"
|
108
108
|
- !ruby/object:Gem::Version
|
109
|
-
version:
|
109
|
+
version: 0.52.1
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
112
|
version_requirements: !ruby/object:Gem::Requirement
|
113
113
|
requirements:
|
114
114
|
- - "~>"
|
115
115
|
- !ruby/object:Gem::Version
|
116
|
-
version:
|
116
|
+
version: 0.52.1
|
117
117
|
description: Use Ruby to make your computer beep at a certain frequency for a certain
|
118
118
|
duration. Do it for fun, or add it to other programs for easy alert sounds.
|
119
119
|
email: mike@codana.me
|
@@ -143,7 +143,7 @@ homepage: http://rubygems.org/gems/feep
|
|
143
143
|
licenses:
|
144
144
|
- MIT
|
145
145
|
metadata: {}
|
146
|
-
post_install_message:
|
146
|
+
post_install_message:
|
147
147
|
rdoc_options: []
|
148
148
|
require_paths:
|
149
149
|
- lib
|
@@ -158,9 +158,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
158
158
|
- !ruby/object:Gem::Version
|
159
159
|
version: '0'
|
160
160
|
requirements: []
|
161
|
-
|
162
|
-
|
163
|
-
signing_key:
|
161
|
+
rubygems_version: 3.1.4
|
162
|
+
signing_key:
|
164
163
|
specification_version: 4
|
165
164
|
summary: Make your computer feep with Ruby
|
166
165
|
test_files:
|