Pachelbel 1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6a36f16adf11839e845eb170a3c2300ef16d89ba
4
+ data.tar.gz: 1218462e10ef281509b7a31a6121629ad8e055f4
5
+ SHA512:
6
+ metadata.gz: 592c3cbcaeeab23cb4542a6bb254ab8698a7b831e85c3e46edb4c95050e2f9a9975928729db75812da36796a3482d1827b49a70047c33069a7add1be5c05ee64
7
+ data.tar.gz: ee515583a6dbcb075f27458baf534381620b62979842c1c05cb2e6c9edc41369e8f4d0c4581dc792bc1ffd8f99302357d497baf2d84f5360d365b609069291bf
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Pachelbel
2
+
3
+ Pachelbel makes processing and synthesizing audio in RubyMotion a breeze. It's built on top of the Web Audio API, which was designed to be simple, yet powerful.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'Pachelbel'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install Pachelbel
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/lib/Pachelbel.rb ADDED
@@ -0,0 +1,8 @@
1
+ unless defined?(Motion::Project::Config)
2
+ raise "This file must be required within a RubyMotion project Rakefile."
3
+ end
4
+
5
+ lib_dir_path = File.dirname(File.expand_path(__FILE__))
6
+ Motion::Project::App.setup do |app|
7
+ app.files.unshift(Dir.glob(File.join(lib_dir_path, "project/**/*.rb")))
8
+ end
@@ -0,0 +1,111 @@
1
+ module Pachelbel
2
+ class AudioContext
3
+ attr_reader :webview
4
+
5
+ HTML = '<script>' + 'window.AudioContext = window.AudioContext || window.webkitAudioContext;' +
6
+ 'var audio_context = new AudioContext();' + 'var audio_nodes = [audio_context.destination];' + '</script>'
7
+
8
+ def run_js(script)
9
+ @webview.stringByEvaluatingJavaScriptFromString script
10
+ end
11
+
12
+ def initialize
13
+ @webview = UIWebView.new
14
+ @webview.delegate = self
15
+ @webview.loadHTMLString HTML, baseURL: nil
16
+ end
17
+
18
+ def webViewDidFinishLoad(_)
19
+ run_js 'audio_context.createOscillator();' # workaround to start timer
20
+ end
21
+
22
+ # API Attributes
23
+
24
+ def currentTime
25
+ run_js('audio_context.currentTime;').to_f
26
+ end
27
+
28
+ def destination
29
+ @destination ||= begin
30
+ object = AudioDestinationNode.allocate
31
+ object._audio_context = self
32
+ object._index = 0
33
+ object
34
+ end
35
+ end
36
+
37
+ def listener
38
+ run_js('audio_context.listener;')
39
+ end
40
+
41
+ def sampleRate
42
+ run_js('audio_context.sampleRate;').to_f
43
+ end
44
+
45
+ # API Constructors
46
+
47
+ def createOscillator
48
+ object = Oscillator.allocate
49
+ object._audio_context = self
50
+ object._index = run_js('audio_nodes.push( audio_context.createOscillator() );').to_i - 1
51
+ object
52
+ end
53
+ end
54
+
55
+ class AudioNode
56
+ attr_reader :audio_context
57
+ attr_reader :index
58
+
59
+ def run_js(script)
60
+ @audio_context.run_js script
61
+ end
62
+
63
+ def _audio_context=(value)
64
+ @audio_context = value
65
+ end
66
+
67
+ def _index=(value)
68
+ @index = value
69
+ end
70
+
71
+ def _js_snippet
72
+ "audio_nodes[#{@index}]"
73
+ end
74
+
75
+ # API Methods
76
+
77
+ def connect(destination)
78
+ run_js("#{_js_snippet}.connect(#{destination._js_snippet});")
79
+ end
80
+ end
81
+
82
+ class AudioDestinationNode < AudioNode
83
+ # API Attributes
84
+
85
+ def maxChannelCount
86
+ run_js("#{_js_snippet}.maxChannelCount;").to_i
87
+ end
88
+ end
89
+
90
+ class Oscillator < AudioNode
91
+ # API Attributes
92
+
93
+ def frequency
94
+ run_js("#{_js_snippet}.frequency.value;").to_f
95
+ end
96
+
97
+ def frequency=(value)
98
+ run_js("#{_js_snippet}.frequency.value = #{value.to_f};").to_f
99
+ end
100
+
101
+ # API Methods
102
+
103
+ def start(time)
104
+ run_js("#{_js_snippet}.start(#{time});")
105
+ end
106
+
107
+ def stop(time)
108
+ run_js("#{_js_snippet}.stop(#{time});")
109
+ end
110
+ end
111
+ end
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: Pachelbel
3
+ version: !ruby/object:Gem::Version
4
+ version: '1.0'
5
+ platform: ruby
6
+ authors:
7
+ - Drew Carey Buglione
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-01-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: Process and synthesize audio in RubyMotion
28
+ email:
29
+ - me@drewb.ug
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - README.md
35
+ - lib/Pachelbel.rb
36
+ - lib/project/Pachelbel.rb
37
+ homepage: ''
38
+ licenses:
39
+ - ''
40
+ metadata: {}
41
+ post_install_message:
42
+ rdoc_options: []
43
+ require_paths:
44
+ - lib
45
+ required_ruby_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ required_rubygems_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ requirements: []
56
+ rubyforge_project:
57
+ rubygems_version: 2.0.6
58
+ signing_key:
59
+ specification_version: 4
60
+ summary: Pachelbel makes processing and synthesizing audio in RubyMotion a breeze.
61
+ It's built on top of the Web Audio API, which was designed to be simple, yet powerful.
62
+ test_files: []