portmidi 0.0.6 → 1.0.0.pre.beta.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1e452838c2123c03f7c8f369384948fc3f3931f5
4
+ data.tar.gz: 0aab730fb12c0cf945c3a8e3a031e185ec464c44
5
+ SHA512:
6
+ metadata.gz: d73b315bcf30a77ba23746bbbe5380c2581770283115f73410d9cda7fb3deb20289997c911a63937c6c8985814b48e962ad75c8e62951b25f24e6d834288fd94
7
+ data.tar.gz: 7ef7471fe2045729288a07fd4516decfa2332ebf8aae2be0fce1351083152eade255020a5f826033f09c170ec9797741a03db8f6b96d8f48e5d803804e40321a
@@ -0,0 +1,11 @@
1
+ ## 1.0.0-beta.1
2
+
3
+ - Added Porttime bindings
4
+
5
+ ## 0.6.0
6
+
7
+ - Fixes and adding PM_Close by Thomas Jachmann
8
+
9
+ ## 0.5.0
10
+
11
+ - "Almost Feature Complete"
@@ -18,15 +18,9 @@ means I will mock away the portmidi layer to test my abstractions and add some o
18
18
  Implementation wise, there's a few things missing:
19
19
 
20
20
  * Setting Channel- and Message filters
21
- * Porttime support(not sure I can support that, I guess it needs multithreading, plus: I did not need it until now)
22
- examples/read_test.rb on how to decipher sysex atm.
23
21
  * More different exceptions, plus support for Host Errors
24
22
  * A lot of safety nets like testing for open devices before reading and writing and such.
25
23
 
26
- == What's coming
27
-
28
- * I'd love to see some explicit support for correctly parsing SysEx, see
29
-
30
24
  == Credits
31
25
 
32
26
  The portmidi wrapper was thrown together by Jan Krutisch <jan@krutisch.de>
@@ -36,31 +30,8 @@ The portmidi wrapper was thrown together by Jan Krutisch <jan@krutisch.de>
36
30
  * Patches by
37
31
  * Thomas Jachmann (http://github.com/thomasjachmann)
38
32
 
39
- == Appendix A: Installing Portmidi on OS X Snow leopard
40
-
41
- This is a major pita, because currently portmidi doesn't officially build for 64 bit, which
42
- makes it impossible to use with the default Snow Leopard Ruby.
43
-
44
- You can try to enable 64 bit support, but I don't have a frekkin clue what this means. It works
45
- for me and my application, but YMMV and I am not responsible for any damage this does
46
- to you or your system.
47
-
48
- To enable 64 bit compilation (you will see quite a few warnings while compiling), open
49
- CMakeLists.txt in the trunk folder and find the following line (around line 39 in my version)
50
-
51
- set(CMAKE_OSX_ARCHITECTURES i386 ppc CACHE STRING "do not build for 64-bit" FORCE)
52
-
53
- and change it to: (yes, the comment is a bit silly)
54
-
55
- set(CMAKE_OSX_ARCHITECTURES i386 ppc x86_64 CACHE STRING "do build for 64-bit" FORCE)
56
-
57
- Now you can call
58
-
59
- make -f pm_mac/Makefile.osx
60
-
61
- if it builds, you can try to install the library. Currently the process seems to be a bit broken,
62
- so you actually need to type:
63
-
64
- sudo env PF=/usr make -f pm_mac/Makefile.osx install
33
+ == Installing Portmidi
65
34
 
66
- yes, this sucks - I'm currently trying to find out with the portmidi authors what it would take to fix all this.
35
+ * On MacOSX, there's a homebrew recipe, so $ brew install portmidi should do the trick
36
+ * On most Linuxes, portmidi should be simply a package to install by your packagemanager
37
+ * On Windows: "try this":http://sourceforge.net/apps/trac/portmedia/wiki/Installing%20portmidi%20on%20Windows
data/Rakefile CHANGED
@@ -2,25 +2,6 @@ require 'rubygems'
2
2
  require 'rake'
3
3
  require File.join(File.dirname(__FILE__), "lib/portmidi/version")
4
4
 
5
- begin
6
- require 'jeweler'
7
-
8
- Jeweler::Tasks.new do |gemspec|
9
- gemspec.name = "portmidi"
10
- gemspec.summary = "An ffi wrapper around the cross platform midi library portmidi"
11
- gemspec.description = "An ffi wrapper around the cross platform midi library portmidi, part of the portmedia framework"
12
- gemspec.email = "jan@krutisch.de"
13
- gemspec.homepage = "http://github.com/halfbyte/portmidi"
14
- gemspec.authors = ["Jan Krutisch"]
15
- gemspec.version = Portmidi::VERSION
16
- gemspec.requirements << "Needs portmidi compiled as a dynamic library"
17
- gemspec.requirements << "On MRI, this needs the ffi gem installed"
18
- end
19
- Jeweler::GemcutterTasks.new
20
- rescue LoadError
21
- puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
22
- end
23
-
24
5
  require 'rake/rdoctask'
25
6
  Rake::RDocTask.new do |rdoc|
26
7
  version = Portmidi::VERSION
@@ -29,4 +10,4 @@ Rake::RDocTask.new do |rdoc|
29
10
  rdoc.title = "Portmidi #{version}"
30
11
  rdoc.rdoc_files.include('README*')
31
12
  rdoc.rdoc_files.include('lib/**/*.rb')
32
- end
13
+ end
@@ -4,9 +4,10 @@ require 'portmidi/device'
4
4
  require 'portmidi/input'
5
5
  require 'portmidi/output'
6
6
  require 'portmidi/exceptions'
7
+ require 'porttime'
7
8
 
8
9
  module Portmidi
9
-
10
+
10
11
  def self.devices(rescan = false)
11
12
  @@devices = []
12
13
  PM_Map.Pm_CountDevices.times do |i|
@@ -15,17 +16,17 @@ module Portmidi
15
16
  end
16
17
  @@devices
17
18
  end
18
-
19
+
19
20
  def self.input_devices
20
21
  self.devices.select{|device| device.type == :input }
21
22
  end
22
23
  def self.output_devices
23
24
  self.devices.select{|device| device.type == :output }
24
25
  end
25
-
26
+
26
27
  # this is not a very good name, but Portmidi::initialize woulda been a worse idea
27
28
  def self.start
28
29
  PM_Map.Pm_Initialize
29
30
  end
30
-
31
+
31
32
  end
@@ -1,6 +1,6 @@
1
1
  module Portmidi
2
2
  class Output
3
-
3
+
4
4
  #
5
5
  # open a device with the given ID
6
6
  #
@@ -12,19 +12,19 @@ module Portmidi
12
12
  raise Portmidi::DeviceError, errnum, "Could not open Device #{device_id} as output device"
13
13
  end
14
14
  end
15
-
15
+
16
16
  def close
17
17
  PM_Map.Pm_Close(@out_stream)
18
18
  end
19
-
19
+
20
20
  #
21
21
  # write a single three byte message
22
22
  #
23
-
24
- def write_short(status, data1, data2)
25
- PM_Map.Pm_WriteShort(@out_stream, 0, PM_Map.encode_message(status, data1, data2))
23
+
24
+ def write_short(status, data1, data2, timestamp = 0)
25
+ PM_Map.Pm_WriteShort(@out_stream, timestamp, PM_Map.encode_message(status, data1, data2))
26
26
  end
27
-
27
+
28
28
  def write(messages)
29
29
  buffer = FFI::MemoryPointer.new(PM_Map::Event, messages.length)
30
30
  messages.length.times do |i|
@@ -34,12 +34,12 @@ module Portmidi
34
34
  end
35
35
  PM_Map.Pm_Write(@out_stream, buffer, messages.length)
36
36
  end
37
-
38
-
39
37
 
40
- #
38
+
39
+
40
+ #
41
41
  # sends the sysex, the message should be an array of byte values
42
- #
42
+ #
43
43
  def write_sysex(sysex)
44
44
  raise "Invalid Sysex Format" if (sysex.first != 0xF0 || sysex.last != 0xF7)
45
45
  msg = FFI::Buffer.alloc_in(:uchar, sysex.length)
@@ -48,11 +48,11 @@ module Portmidi
48
48
  end
49
49
  PM_Map.Pm_WriteSysEx(@out_stream, 0, msg)
50
50
  end
51
-
51
+
52
52
  private
53
53
  def packEvent(message)
54
54
  ((((message[3] || 0) << 24) & 0xFF000000) | (((message[2] || 0) << 16) & 0xFF0000) | (((message[1] || 0) << 8) & 0xFF00) | ((message[0]) & 0xFF))
55
55
  end
56
-
56
+
57
57
  end
58
- end
58
+ end
@@ -7,7 +7,7 @@ module Portmidi
7
7
  attach_function :Pm_CountDevices, [], :int
8
8
  attach_function :Pm_Initialize, [], :void
9
9
  attach_function :Pm_GetDeviceInfo,[:int], :pointer
10
-
10
+
11
11
  attach_function :Pm_OpenInput, [:pointer, :int, :pointer, :int, :pointer, :pointer], :int
12
12
  attach_function :Pm_OpenOutput, [:pointer, :int, :pointer, :int, :pointer, :pointer, :int32], :int
13
13
  attach_function :Pm_Poll, [:pointer], :int
@@ -18,9 +18,14 @@ module Portmidi
18
18
  attach_function :Pm_Close, [:pointer], :int
19
19
 
20
20
  attach_function :Pm_GetErrorText, [:int], :string
21
-
21
+
22
+ callback :timer_function, [:int32, :pointer], :void
23
+ attach_function :Pt_Start, [:int, :timer_function, :pointer], :int
24
+ attach_function :Pt_Time, [], :int32
25
+
26
+
22
27
  #attach_function :Pt_Start, [:int, :pointer, :pointer], :int
23
-
28
+
24
29
  class DeviceInfo < FFI::Struct
25
30
  layout :struct_version, :int,
26
31
  :midi_api, :string,
@@ -29,14 +34,14 @@ module Portmidi
29
34
  :output, :int,
30
35
  :opened, :int
31
36
  end
32
-
37
+
33
38
  class Event < FFI::Struct
34
39
  layout :message, :int32,
35
40
  :timestamp, :int32
36
41
  end
37
-
42
+
38
43
  def self.encode_message(status, data1, data2)
39
44
  ((((data2) << 16) & 0xFF0000) | (((data1) << 8) & 0xFF00) | ((status) & 0xFF))
40
- end
45
+ end
41
46
  end
42
47
  end
@@ -1,3 +1,3 @@
1
1
  module Portmidi
2
- VERSION = "0.0.6"
3
- end
2
+ VERSION = "1.0.0-beta.1"
3
+ end
@@ -0,0 +1,20 @@
1
+ module Porttime
2
+ TimerCallback = FFI::Function.new(:void, [:int32, :pointer]) do |timestamp, user_data|
3
+ @timer_callback.call(timestamp, user_data)
4
+ end
5
+
6
+ # Start the Porttime timer system
7
+ # * interval is in milliseconds
8
+ # * You can add arbitrary user data that will be given to the callback
9
+ # * the callback block will be called each interval seconds.
10
+ def self.start(interval=20, user_data=nil, &block)
11
+ @timer_callback = block
12
+ Portmidi::PM_Map.Pt_Start(interval, Porttime::TimerCallback, user_data)
13
+ end
14
+
15
+ # Get the current time
16
+ # * you can use that to figure out how to properly schedule events into the future
17
+ def self.time
18
+ Portmidi::PM_Map.Pt_Time
19
+ end
20
+ end
metadata CHANGED
@@ -1,35 +1,39 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: portmidi
3
- version: !ruby/object:Gem::Version
4
- version: 0.0.6
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.pre.beta.1
5
5
  platform: ruby
6
- authors:
6
+ authors:
7
7
  - Jan Krutisch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
-
12
- date: 2009-11-15 00:00:00 +01:00
13
- default_executable:
14
- dependencies: []
15
-
16
- description: An ffi wrapper around the cross platform midi library portmidi, part of the portmedia framework
11
+ date: 2018-01-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ffi
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.9'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.9'
27
+ description: An ffi wrapper around the cross platform midi library portmidi, part
28
+ of the portmedia framework
17
29
  email: jan@krutisch.de
18
30
  executables: []
19
-
20
31
  extensions: []
21
-
22
- extra_rdoc_files:
23
- - README.rdoc
24
- files:
25
- - .gitignore
26
- - CHANGELOG
32
+ extra_rdoc_files: []
33
+ files:
34
+ - CHANGELOG.md
27
35
  - README.rdoc
28
36
  - Rakefile
29
- - examples/helper.rb
30
- - examples/read_test.rb
31
- - examples/write_sysex_test.rb
32
- - examples/write_test.rb
33
37
  - lib/portmidi.rb
34
38
  - lib/portmidi/device.rb
35
39
  - lib/portmidi/exceptions.rb
@@ -37,42 +41,32 @@ files:
37
41
  - lib/portmidi/output.rb
38
42
  - lib/portmidi/pm_map.rb
39
43
  - lib/portmidi/version.rb
44
+ - lib/porttime.rb
40
45
  - license.txt
41
46
  - test/helper.rb
42
47
  - test/test_portmidi.rb
43
- has_rdoc: true
44
48
  homepage: http://github.com/halfbyte/portmidi
45
49
  licenses: []
46
-
50
+ metadata: {}
47
51
  post_install_message:
48
- rdoc_options:
49
- - --charset=UTF-8
50
- require_paths:
52
+ rdoc_options: []
53
+ require_paths:
51
54
  - lib
52
- required_ruby_version: !ruby/object:Gem::Requirement
53
- requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- version: "0"
57
- version:
58
- required_rubygems_version: !ruby/object:Gem::Requirement
59
- requirements:
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ requirements:
60
57
  - - ">="
61
- - !ruby/object:Gem::Version
62
- version: "0"
63
- version:
64
- requirements:
58
+ - !ruby/object:Gem::Version
59
+ version: 2.0.0
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">"
63
+ - !ruby/object:Gem::Version
64
+ version: 1.3.1
65
+ requirements:
65
66
  - Needs portmidi compiled as a dynamic library
66
- - On MRI, this needs the ffi gem installed
67
67
  rubyforge_project:
68
- rubygems_version: 1.3.5
68
+ rubygems_version: 2.5.1
69
69
  signing_key:
70
- specification_version: 3
70
+ specification_version: 4
71
71
  summary: An ffi wrapper around the cross platform midi library portmidi
72
- test_files:
73
- - test/helper.rb
74
- - test/test_portmidi.rb
75
- - examples/helper.rb
76
- - examples/read_test.rb
77
- - examples/write_sysex_test.rb
78
- - examples/write_test.rb
72
+ test_files: []
data/.gitignore DELETED
@@ -1,3 +0,0 @@
1
- pkg/
2
- *.gemspec
3
- rdoc/
data/CHANGELOG DELETED
@@ -1,3 +0,0 @@
1
- 0.6.0 Fixes and adding PM_Close by Thomas Jachmann
2
-
3
- 0.5.0 "Almost Feature Complete"
@@ -1,5 +0,0 @@
1
- require 'rubygems'
2
- $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
- require 'portmidi'
4
-
5
- Portmidi.start
@@ -1,47 +0,0 @@
1
- require 'helper'
2
- Portmidi.input_devices.each do |dev|
3
- puts "%d > %s" % [dev.device_id, dev.name]
4
- end
5
- puts "choose device id"
6
- device_id = gets()
7
-
8
- input = Portmidi::Input.new(device_id.to_i)
9
- cnt = 0
10
- data = []
11
- running_sysex = []
12
- sysex_is_on = false
13
- loop do
14
- begin
15
- events = input.read(16)
16
- if events
17
- events.each do |event|
18
-
19
-
20
- if event[:message][0] == 0xF0
21
- running_sysex = event[:message]
22
- sysex_is_on = true
23
- elsif sysex_is_on
24
- if event[:message][0] < 0x80
25
- running_sysex += event[:message]
26
- if event[:message].include?(0xF7)
27
- data << running_sysex.flatten
28
- puts running_sysex.inspect
29
- sysex_is_on = false
30
- end
31
- else
32
- puts event[:message].inspect
33
- sysex_is_on = false
34
- puts "cancelled sysex"
35
- end
36
- end
37
- end
38
- # data << events
39
- else
40
- # puts "poll" if cnt % 10000 == 0
41
- end
42
- rescue Portmidi::DeviceError => e
43
- puts e.portmidi_error
44
- end
45
- cnt += 1
46
- #sleep 0.002
47
- end
@@ -1,11 +0,0 @@
1
- require 'helper'
2
- sysex = [0xF0, 00, 12, 0x12, 0xF7]
3
-
4
- Portmidi.output_devices.each do |dev|
5
- puts "%d > %s" % [dev.device_id, dev.name]
6
- end
7
- puts "choose device id"
8
- device_id = gets()
9
-
10
- output = Portmidi::Output.new(device_id.to_i)
11
- output.write_sysex(sysex)
@@ -1,14 +0,0 @@
1
- require 'helper'
2
- messages = [
3
- {:message => [0x90, 0x33, 0x7F], :timestamp => 0},
4
- {:message => [0x90, 0x33, 0x00], :timestamp => 0}
5
- ]
6
-
7
- Portmidi.output_devices.each do |dev|
8
- puts "%d > %s" % [dev.device_id, dev.name]
9
- end
10
- puts "choose device id"
11
- device_id = gets()
12
-
13
- output = Portmidi::Output.new(device_id.to_i)
14
- output.write(messages)