synthesize 1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (8) hide show
  1. data/CHANGELOG +1 -0
  2. data/LICENSE +1 -0
  3. data/Manifest +7 -0
  4. data/README +13 -0
  5. data/Rakefile +10 -0
  6. data/lib/synthesize.rb +135 -0
  7. data/synthesize.gemspec +31 -0
  8. metadata +81 -0
@@ -0,0 +1 @@
1
+ v1.0. Basic, no optimisations, etc
data/LICENSE ADDED
@@ -0,0 +1 @@
1
+ No license, do what you like.
@@ -0,0 +1,7 @@
1
+ CHANGELOG
2
+ LICENSE
3
+ Manifest
4
+ README
5
+ Rakefile
6
+ lib/synthesize.rb
7
+ synthesize.gemspec
data/README ADDED
@@ -0,0 +1,13 @@
1
+ This gem generates waveforms. Waveform data ranges from 1 to -1.
2
+
3
+ Example:
4
+ s = Synthesize.new(440, 1, 1) 440 Hz, Max Amplitude, 1 Second
5
+ s.square
6
+
7
+ f = File.new("square.wav", "w")
8
+ f.write(s.to_wav)
9
+ f.close
10
+
11
+
12
+ Thanks to Damien Karras for the algorithms!
13
+ http://en.wikibooks.org/wiki/Sound_Synthesis_Theory/Oscillators_and_Wavetables
@@ -0,0 +1,10 @@
1
+ require 'echoe'
2
+ Echoe.new('synthesize') do |e|
3
+ e.author = "James Whayman"
4
+ e.email = "whayman.jw@gmail.com"
5
+ e.description = "Produces basic waveforms, sine, square, sawtooth, triangle. White noise and silence included free!"
6
+ e.summary = "Generate basic waveforms (sine, square, sawtooth, triangle), white noise and silence."
7
+ e.version = "1.1"
8
+ e.url = "https://github.com/jwhayman/rSynthesize"
9
+ e.install_message = "`'~,.,~'`'~,.,~'`'~,.,~'`'~,.,~'"
10
+ end
@@ -0,0 +1,135 @@
1
+ #Synthesis
2
+ #Generate Basic Waveforms and Noise
3
+
4
+ class Synthesize
5
+
6
+ attr_accessor :waveform, :frequency, :amplitude, :duration, :channels, :sample_rate, :bits_per_sample
7
+
8
+ def initialize(frequency, amplitude, duration)
9
+ @frequency = frequency
10
+ @amplitude = amplitude
11
+ @duration = duration
12
+ @channels = 2
13
+ @sample_rate = 44100
14
+ @bits_per_sample = 16
15
+ end
16
+
17
+ def sin
18
+ step = (2 * Math::PI * @frequency).fdiv(@sample_rate)
19
+ phase = 0
20
+ @waveform = Array.new(@duration * @sample_rate)
21
+ @waveform.each_index do |i|
22
+ @waveform[i] = @amplitude * Math.sin(phase)
23
+
24
+ phase = phase + step
25
+ if phase > (2 * Math::PI)
26
+ phase = phase - (2 * Math::PI)
27
+ end
28
+ end
29
+ end
30
+
31
+ def square
32
+ step = (2 * Math::PI * @frequency).fdiv(@sample_rate)
33
+ phase = 0
34
+ @waveform = Array.new(@duration * @sample_rate)
35
+ @waveform.each_index do |i|
36
+ if phase < Math::PI
37
+ @waveform[i] = @amplitude
38
+ else
39
+ @waveform[i] = -@amplitude
40
+ end
41
+
42
+ phase = phase + step
43
+ if phase > (2 * Math::PI)
44
+ phase = phase - (2 * Math::PI)
45
+ end
46
+ end
47
+ end
48
+
49
+ def sawtooth
50
+ step = (2 * Math::PI * @frequency).fdiv(@sample_rate)
51
+ phase = 0
52
+ @waveform = Array.new(@duration * @sample_rate)
53
+ @waveform.each_index do |i|
54
+ @waveform[i] = @amplitude - (@amplitude.fdiv(Math::PI)) * phase
55
+
56
+ phase = phase + step
57
+ if phase > (2 * Math::PI)
58
+ phase = phase - (2 * Math::PI)
59
+ end
60
+ end
61
+ end
62
+
63
+ def triangle
64
+ step = (2 * Math::PI * @frequency).fdiv(@sample_rate)
65
+ phase = 0
66
+ @waveform = Array.new(@duration * @sample_rate)
67
+ @waveform.each_index do |i|
68
+ if phase < Math::PI
69
+ @waveform[i] = -@amplitude + (2 * @amplitude.fdiv(Math::PI)) * phase
70
+ else
71
+ @waveform[i] = 3 * @amplitude - (2 * @amplitude.fdiv(Math::PI)) * phase
72
+ end
73
+
74
+ phase = phase + step
75
+ if phase > (2 * Math::PI)
76
+ phase = phase - (2 * Math::PI)
77
+ end
78
+ end
79
+ end
80
+
81
+ def noise
82
+ @waveform = Array.new(@duration * @sample_rate)
83
+ @waveform.each_index do |i|
84
+ waveform[i] = rand(2) - 1
85
+ end
86
+ end
87
+
88
+ def silence
89
+ @waveform = Array.new(@duration * @sample_rate)
90
+ @waveform.each_index do |i|
91
+ waveform[i] = 0
92
+ end
93
+ end
94
+
95
+ def to_wav
96
+ waveform = Array.new
97
+
98
+ @waveform.each do |w|
99
+ value = w * ((2**@bits_per_sample) / 2)
100
+ if value > 0
101
+ value = value - 1
102
+ elsif value < 0
103
+ value = value + 1
104
+ end
105
+ @channels.times do |c|
106
+ waveform.push(value)
107
+ end
108
+ end
109
+
110
+ block_align = (@bits_per_sample / 8) * @channels
111
+ bytes_per_second = block_align * @sample_rate
112
+
113
+ header = Array[
114
+ "RIFF", #Chunk ID
115
+ bytes_per_second * @duration + 44 - 8, #Chunk Data Size
116
+ "WAVE", #RIFF Type
117
+ "fmt ", #Chunk ID
118
+ 16, #Chunk Data Size
119
+ 1, #Compression Code
120
+ @channels, #Number of Channels
121
+ @sample_rate, #Sample Rate
122
+ bytes_per_second, #Bytes per Second
123
+ block_align, #Block Align
124
+ @bits_per_sample, #Significant Bits per Sample
125
+ "data", #Chunk ID
126
+ bytes_per_second * @duration] #Chunk Data Size
127
+
128
+
129
+ header_data = header.pack("A4VA4A4VvvVVvvA4V")
130
+ wav_data = waveform.pack("s*")
131
+
132
+ return header_data + wav_data
133
+ end
134
+ end
135
+
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{synthesize}
5
+ s.version = "1.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["James Whayman"]
9
+ s.date = %q{2010-12-25}
10
+ s.description = %q{Produces basic waveforms, sine, square, sawtooth, triangle. White noise and silence included free!}
11
+ s.email = %q{whayman.jw@gmail.com}
12
+ s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README", "lib/synthesize.rb"]
13
+ s.files = ["CHANGELOG", "LICENSE", "Manifest", "README", "Rakefile", "lib/synthesize.rb", "synthesize.gemspec"]
14
+ s.homepage = %q{https://github.com/jwhayman/rSynthesize}
15
+ s.post_install_message = %q{`'~,.,~'`'~,.,~'`'~,.,~'`'~,.,~'}
16
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Synthesize", "--main", "README"]
17
+ s.require_paths = ["lib"]
18
+ s.rubyforge_project = %q{synthesize}
19
+ s.rubygems_version = %q{1.3.7}
20
+ s.summary = %q{Generate basic waveforms (sine, square, sawtooth, triangle), white noise and silence.}
21
+
22
+ if s.respond_to? :specification_version then
23
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
24
+ s.specification_version = 3
25
+
26
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
27
+ else
28
+ end
29
+ else
30
+ end
31
+ end
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: synthesize
3
+ version: !ruby/object:Gem::Version
4
+ hash: 13
5
+ prerelease: false
6
+ segments:
7
+ - 1
8
+ - 1
9
+ version: "1.1"
10
+ platform: ruby
11
+ authors:
12
+ - James Whayman
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-12-25 00:00:00 -04:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: Produces basic waveforms, sine, square, sawtooth, triangle. White noise and silence included free!
22
+ email: whayman.jw@gmail.com
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files:
28
+ - CHANGELOG
29
+ - LICENSE
30
+ - README
31
+ - lib/synthesize.rb
32
+ files:
33
+ - CHANGELOG
34
+ - LICENSE
35
+ - Manifest
36
+ - README
37
+ - Rakefile
38
+ - lib/synthesize.rb
39
+ - synthesize.gemspec
40
+ has_rdoc: true
41
+ homepage: https://github.com/jwhayman/rSynthesize
42
+ licenses: []
43
+
44
+ post_install_message: `'~,.,~'`'~,.,~'`'~,.,~'`'~,.,~'
45
+ rdoc_options:
46
+ - --line-numbers
47
+ - --inline-source
48
+ - --title
49
+ - Synthesize
50
+ - --main
51
+ - README
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ hash: 11
69
+ segments:
70
+ - 1
71
+ - 2
72
+ version: "1.2"
73
+ requirements: []
74
+
75
+ rubyforge_project: synthesize
76
+ rubygems_version: 1.3.7
77
+ signing_key:
78
+ specification_version: 3
79
+ summary: Generate basic waveforms (sine, square, sawtooth, triangle), white noise and silence.
80
+ test_files: []
81
+