micro-osc 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2011-2012 Ari Russo
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
@@ -0,0 +1,74 @@
1
+ = MicroOSC
2
+
3
+ A Ruby DSL for OSC
4
+
5
+ == Features
6
+
7
+ * Works with MRI and JRuby
8
+ * Network resources are invisible to the user even when shared or multiplexed
9
+ * Includes shortcuts for common tasks associated with OSC such as translating numeric values from one range to another
10
+ * Network discoverable using {Zeroconf}[http://en.wikipedia.org/wiki/Zero_configuration_networking]
11
+
12
+ == Requirements
13
+
14
+ Ruby (MRI) 1.9.2+ or JRuby (in 1.9 mode)
15
+
16
+ {eventmachine}[http://github.com/eventmachine/eventmachine] (version 0.12.8 recommended for MRI)
17
+
18
+ {osc-access}[http://github.com/arirusso/osc-access]
19
+
20
+ {osc-ruby}[http://github.com/aberant/osc-ruby]
21
+
22
+ (These should install automatically with the gem)
23
+
24
+ For Zeroconf support, {dnssd}[http://github.com/tenderlove/dnssd] is required.
25
+
26
+ == Installation
27
+
28
+ gem install micro-osc
29
+
30
+ == Usage
31
+
32
+ The following are two MicroOSC programs; the first will receive OSC messages and the second will send one. Run them in two separate windows and they will talk to each other.
33
+
34
+ Here's the receiver...
35
+
36
+ require "osc"
37
+
38
+ OSC.using(:input_port => 8000) do
39
+
40
+ receive("/greeting") { |val| p "received #{val}" }
41
+
42
+ p "Ready to receive OSC messages on port(s) #{input_ports.join(', ')}..."
43
+
44
+ wait_for_input
45
+
46
+ end
47
+
48
+ When you run this, You should see confirmation that the program is running "Ready to receive OSC..." in your Ruby console.
49
+
50
+ Next, in another window run this the client program:
51
+
52
+ require "osc"
53
+
54
+ OSC.using(:output => { :host => "localhost", :port => 8000 }) do
55
+
56
+ out "/greeting", "hullo!"
57
+
58
+ end
59
+
60
+ After running it, flip back to the first receiver program and see "received hullo!", confirming that these two programs could reach each other.
61
+
62
+ Note that a single MicroOSC block can act as a client and receiver, both sending and receiving OSC ({see here...}[http://github.com/arirusso/micro-osc/blob/master/examples/duplex.rb])
63
+
64
+ These examples and more are available {here}[http://github.com/arirusso/micro-osc/tree/master/examples]
65
+
66
+ == Other Documentation
67
+
68
+ * {rdoc}[http://rubydoc.info/github/arirusso/micro-osc]
69
+
70
+ == License
71
+
72
+ Licensed under Apache 2.0, See the file LICENSE
73
+
74
+ Copyright © 2011-2012 Ari Russo
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # MicroOSC
4
+ # A Ruby DSL for OSC
5
+ # (c)2011 Ari Russo and licensed under the Apache 2.0 License
6
+ #
7
+
8
+ # libs
9
+ require "forwardable"
10
+ require "osc-access"
11
+
12
+ # modules
13
+
14
+ # classes
15
+ require "micro-osc/context"
16
+ require "micro-osc/state"
17
+
18
+ module MicroOSC
19
+
20
+ VERSION = "0.0.1"
21
+
22
+ def self.message(options = {}, &block)
23
+ MicroOSC::Context.new(options, &block)
24
+ end
25
+
26
+ class << self
27
+ alias_method :using, :message
28
+ end
29
+
30
+ end
31
+
32
+ # define this module again to avoid overwriting another OSC module
33
+ module OSC
34
+
35
+ def self.message(*a, &block)
36
+ MicroOSC.using(*a, &block)
37
+ end
38
+
39
+ class << self
40
+ alias_method :using, :message
41
+ end
42
+
43
+ end
44
+
45
+ require "micro-osc/shorthand"
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+
4
+ module MicroOSC
5
+
6
+ class Context
7
+
8
+ include OSCAccessible
9
+
10
+ extend Forwardable
11
+
12
+ attr_reader :state
13
+
14
+ def_delegator :state, :output_cache, :cache
15
+
16
+ alias_method :output, :osc_send
17
+ alias_method :receive, :osc_receive
18
+
19
+ def initialize(options = {}, &block)
20
+ @state = State.new
21
+ osc_start(options.merge({}))
22
+ edit(&block) if block_given?
23
+ end
24
+
25
+ # open a block for editing/live coding in this Context
26
+ def edit(&block)
27
+ self.instance_eval(&block)
28
+ end
29
+
30
+ def receive(pattern, options = {}, &block)
31
+ osc_receive(pattern, options) { |target_obj, val| yield(val) }
32
+ sleep(0.01)
33
+ end
34
+
35
+ # repeat the last command
36
+ def repeat
37
+ self.send(@state.last_command[:method], *@state.last_command[:args]) unless @state.last_command.nil?
38
+ end
39
+
40
+ # shortcut to an array of port numbers
41
+ def input_ports
42
+ @osc_receiver.servers.keys
43
+ end
44
+
45
+ def method_missing(m, *a, &b)
46
+ outp = nil
47
+ options = a.last.kind_of?(Hash) ? a.last : {}
48
+ do_output = options[:output] || true
49
+ outp = super
50
+ @state.record(m, a, b, outp)
51
+ end
52
+
53
+ def join(options = {})
54
+ osc_join(options)
55
+ end
56
+ alias_method :wait_for_input, :join
57
+
58
+ end
59
+ end
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+
4
+ module MicroOSC
5
+
6
+ alias l loop
7
+
8
+ class << self
9
+ alias_method :m, :message
10
+ end
11
+
12
+ class Context
13
+ alias_method :o, :output
14
+ alias_method :out, :output
15
+ alias_method :r, :repeat
16
+ end
17
+
18
+ end
19
+
20
+ def O(*a, &block)
21
+ OSC.message(*a, &block)
22
+ end
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ module MicroOSC
4
+
5
+ class State
6
+
7
+ Default = {
8
+ :channel => 0,
9
+ :octave => 2,
10
+ :velocity => 100
11
+ }
12
+
13
+ attr_accessor :auto_output,
14
+ :pattern,
15
+ :super_sticky
16
+
17
+ attr_reader :last_command,
18
+ :output_cache
19
+
20
+ def initialize(options = {})
21
+ @auto_output = true
22
+ @last_command = nil
23
+ @super_sticky = false
24
+
25
+ @channel = options[:channel] || Default[:channel]
26
+ @velocity = options[:velocity] || Default[:velocity]
27
+ @octave = options[:octave] || Default[:octave]
28
+
29
+ end
30
+
31
+ def record(m, a, b, outp)
32
+ ts = now
33
+ @output_cache << { :message => outp, :timestamp => ts }
34
+ @last_command = { :method => m, :args => a, :block => b, :timestamp => ts }
35
+ end
36
+
37
+ def toggle_super_sticky
38
+ @super_sticky = !@super_sticky
39
+ end
40
+
41
+ def toggle_auto_output
42
+ @auto_output = !@auto_output
43
+ end
44
+
45
+ def message_properties(opts, *props)
46
+ output = {}
47
+ props.each do |prop|
48
+ output[prop] = opts[prop]
49
+ self.send("#{prop.to_s}=", output[prop]) if !output[prop].nil? && (self.send(prop).nil? || @super_sticky)
50
+ output[prop] ||= self.send(prop.to_s)
51
+ end
52
+ output
53
+ end
54
+
55
+
56
+ end
57
+
58
+ end
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # micromidi
4
+ # A Ruby DSL for OSC
5
+ #
6
+ # (c)2011 Ari Russo
7
+ # licensed under the Apache 2.0 License
8
+ #
9
+
10
+ # the purpose of this file is just to allow both
11
+ # <em>require "micro-osc"</em>
12
+ # and
13
+ # <em>require "osc"</em>
14
+
15
+ require 'micro-osc'
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ dir = File.dirname(File.expand_path(__FILE__))
4
+ $LOAD_PATH.unshift dir + '/../lib'
5
+
6
+ require 'test/unit'
7
+ require 'micro-osc'
8
+
9
+ module TestHelper
10
+
11
+ $port_counter = 8000
12
+
13
+ def self.next_port
14
+ $port_counter += 1
15
+ end
16
+
17
+ end
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'helper'
4
+
5
+ class ContextTest < Test::Unit::TestCase
6
+
7
+ include MicroOSC
8
+ include TestHelper
9
+
10
+ def test_output
11
+ sleep(0.5)
12
+ received = nil
13
+ port = TestHelper.next_port
14
+
15
+ server = OSC::EMServer.new(port)
16
+ server.add_method("/test_output") do |message|
17
+ received = message.args[0]
18
+ end
19
+ Thread.new { server.run }
20
+
21
+ sleep(0.5)
22
+
23
+ OSC.using(:output => { :port => port, :host => "localhost" }) do
24
+ output("/test_output", "hi friend")
25
+ end
26
+
27
+ sleep(0.5)
28
+
29
+ assert_equal("hi friend", received)
30
+ end
31
+
32
+ def test_input
33
+ sleep(0.5)
34
+ received = nil
35
+ port = TestHelper.next_port
36
+
37
+ OSC.using(:input_port => port) do
38
+ receive("/test_input") do |val|
39
+ received = val
40
+ end
41
+ end
42
+ sleep(0.5)
43
+
44
+ client = OSC::Client.new("localhost", port)
45
+ client.send( OSC::Message.new( "/test_input", "hullo from test_input!"))
46
+ sleep(0.5)
47
+
48
+ assert_equal("hullo from test_input!", received)
49
+ end
50
+
51
+ end
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: micro-osc
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ari Russo
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-17 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: eventmachine
16
+ requirement: &70257285738520 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70257285738520
25
+ - !ruby/object:Gem::Dependency
26
+ name: osc-access
27
+ requirement: &70257285769300 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70257285769300
36
+ - !ruby/object:Gem::Dependency
37
+ name: osc-ruby
38
+ requirement: &70257285768880 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70257285768880
47
+ description: A Ruby DSL for OSC
48
+ email:
49
+ - ari.russo@gmail.com
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - lib/micro-osc/context.rb
55
+ - lib/micro-osc/shorthand.rb
56
+ - lib/micro-osc/state.rb
57
+ - lib/micro-osc.rb
58
+ - lib/osc.rb
59
+ - test/helper.rb
60
+ - test/test_context.rb
61
+ - LICENSE
62
+ - README.rdoc
63
+ homepage: http://github.com/arirusso/micro-osc
64
+ licenses: []
65
+ post_install_message:
66
+ rdoc_options: []
67
+ require_paths:
68
+ - lib
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ none: false
71
+ requirements:
72
+ - - ! '>='
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ! '>='
79
+ - !ruby/object:Gem::Version
80
+ version: 1.3.6
81
+ requirements: []
82
+ rubyforge_project: osc-access
83
+ rubygems_version: 1.8.17
84
+ signing_key:
85
+ specification_version: 3
86
+ summary: A Ruby DSL for OSC
87
+ test_files: []