hammelin 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/demos/each.rb ADDED
@@ -0,0 +1,8 @@
1
+ require_relative '../lib/hammelin'
2
+
3
+ note = Hammelin::Note.new("C")
4
+ beat = note.upto("D#").map{|n| n.upto("D#")}
5
+
6
+ Hammelin.compose "iterative.mid" do
7
+ 5.times { play beat }
8
+ end
data/demos/nested_play.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require_relative '../lib/hammelin'
2
2
 
3
- Hammelin.compose("file.mid") do
3
+ Hammelin.compose("nested.mid") do
4
4
 
5
5
  note = Hammelin::Note.new("C")
6
6
  tune = note.upto("D#")
@@ -17,4 +17,4 @@ Hammelin.compose("file.mid") do
17
17
 
18
18
  end
19
19
 
20
- end
20
+ end
@@ -15,11 +15,14 @@ module Hammelin
15
15
  @logged_music_string = ""
16
16
 
17
17
  def play(tune)
18
- if playable_tune?(tune)
19
- play_tune(tune)
20
- else
21
- play_string(tune)
22
- end
18
+ tune.play
19
+ rescue NoMethodError
20
+ case tune
21
+ when String
22
+ Note.new(tune).play
23
+ when Array
24
+ NotesRange.from_array(tune).play
25
+ end
23
26
  end
24
27
 
25
28
  def play_string(tune)
@@ -28,19 +31,6 @@ module Hammelin
28
31
  player.close
29
32
  end
30
33
 
31
- def playable_tune?(tune)
32
- return true if tune.respond_to? :play
33
- return true if tune.is_a?(Array) ? playable_tune?(tune.first) : false
34
- end
35
-
36
- def play_tune(tune)
37
- if tune.respond_to? :play
38
- tune.play
39
- else
40
- tune.each(&:play) if playable_tune?(tune.first)
41
- end
42
- end
43
-
44
34
  def compose(filename=nil,&block)
45
35
  instance_eval &block
46
36
  save_to_file(filename) if filename
@@ -50,6 +40,10 @@ module Hammelin
50
40
 
51
41
  private
52
42
 
43
+ def player
44
+ @player ||= Player.new
45
+ end
46
+
53
47
  def add_to_log(tune)
54
48
  logged_music_string << tune + PADDING
55
49
  end
@@ -63,8 +57,4 @@ module Hammelin
63
57
  player.save_midi(logged_music_string,file)
64
58
  end
65
59
 
66
- def player
67
- @player ||= Player.new
68
- end
69
-
70
60
  end
data/lib/hammelin/note.rb CHANGED
@@ -5,8 +5,8 @@ module Hammelin
5
5
  include Comparable
6
6
  attr_accessor :token
7
7
 
8
- OCTAVE_JUMP = 12
9
- MAX_VALUE = 127
8
+ OCTAVE_JUMP = 12
9
+ MAX_VALUE = 127
10
10
  CAPPED_VALUE = MAX_VALUE - OCTAVE_JUMP
11
11
 
12
12
  def initialize(note)
@@ -14,15 +14,15 @@ module Hammelin
14
14
  end
15
15
 
16
16
  def play
17
- Hammelin.play(music_string)
17
+ Hammelin.play_string (music_string)
18
18
  end
19
19
 
20
20
  def upto(note)
21
- NotesRange.new(self,Note.new(note))
21
+ NotesRange.from_range(self,Note.new(note))
22
22
  end
23
23
 
24
24
  def downto(note)
25
- NotesRange.new(Note.new(note),self)
25
+ NotesRange.from_range(Note.new(note),self)
26
26
  end
27
27
 
28
28
  def self.from_value(value)
@@ -42,11 +42,13 @@ module Hammelin
42
42
  end
43
43
 
44
44
  def increase_octave!(times)
45
- self.token = increase_octaves(times).value
45
+ value = increase_octave(times).value
46
+ self.token = "[#{value}]"
46
47
  end
47
48
 
48
49
  def decrease_octave!(times)
49
- self.token = decrease_octaves(times).value
50
+ value = decrease_octave(times).value
51
+ self.token = "[#{value}]"
50
52
  end
51
53
 
52
54
  def value
@@ -64,19 +66,19 @@ module Hammelin
64
66
  end
65
67
 
66
68
  def higher_octave(times=1)
67
- OCTAVE_JUMP*times + self.value unless highest_octave?
69
+ highest_octave? ? value : OCTAVE_JUMP*times + self.value
68
70
  end
69
71
 
70
72
  def lower_octave(times=1)
71
- OCTAVE_JUMP*times + self.value unless lowest_octave?
73
+ lowest_octave? ? value : OCTAVE_JUMP*times + self.value
72
74
  end
73
75
 
74
76
  def highest_octave?
75
- self.value >= CAPPED_VALUE
77
+ self.value + OCTAVE_JUMP >= CAPPED_VALUE
76
78
  end
77
79
 
78
80
  def lowest_octave?
79
- self.value <= OCTAVE_JUMP
81
+ self.value - OCTAVE_JUMP <= OCTAVE_JUMP
80
82
  end
81
83
 
82
84
  end
@@ -4,35 +4,43 @@ module Hammelin
4
4
 
5
5
  class NotesRange < DelegateClass(Array)
6
6
 
7
- def initialize(from,to)
8
- @from, @to = from,to
9
- super(transverse_notes)
7
+ def initialize(array)
8
+ super(array)
10
9
  end
11
10
 
12
- def play
13
- Hammelin.play music_string
14
- self
11
+ def self.from_range(from,to)
12
+ NotesRange.new(transverse_notes(from,to))
13
+ end
14
+
15
+ def self.from_array(array)
16
+ notes_range = array.inject([]) {|notes,notes_range| notes += notes_range }
17
+ NotesRange.new(notes_range)
15
18
  end
16
19
 
17
- def reverse
18
- NotesRange.new(@to,@from)
20
+ def play
21
+ Hammelin.play_string music_string
22
+ self
19
23
  end
20
24
 
21
25
  # downto and upto are just some sintactic sugar for expanding the range to
22
26
  # a new value. It will create a new NotesRange object with the last Note
23
27
  # and then will figure out how to get to the newest one.
24
28
  def downto(value)
25
- NotesRange.new(@to,value)
29
+ NotesRange.from_range(last,value)
26
30
  end
27
31
 
28
32
  alias :upto :downto
29
33
 
30
34
  def increase_octave(times=1)
31
- NotesRange.new(@from.increase_octave(times), @to.increase_octave(times))
35
+ notes = map {|note| note.increase_octave(times)}
36
+
37
+ NotesRange.new(notes)
32
38
  end
33
39
 
34
40
  def decrease_octave(times=1)
35
- NotesRange.new(@from.decrease_octave(times), @to.decrease_octave(times))
41
+ notes = map {|note| note.decrease_octave(times)}
42
+
43
+ NotesRange.new(notes)
36
44
  end
37
45
 
38
46
  def music_string
@@ -41,11 +49,11 @@ module Hammelin
41
49
 
42
50
  private
43
51
 
44
- def transverse_notes
45
- enum = if @from > @to
46
- @from.value.downto(@to.value)
52
+ def self.transverse_notes(from,to)
53
+ enum = if from > to
54
+ from.value.downto(to.value)
47
55
  else
48
- @from.value.upto(@to.value)
56
+ from.value.upto(to.value)
49
57
  end
50
58
  enum.map{|value| Note.from_value(value) }
51
59
  end
@@ -1,3 +1,3 @@
1
1
  module Hammelin
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
metadata CHANGED
@@ -2,15 +2,15 @@
2
2
  name: hammelin
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.2
5
+ version: 0.0.3
6
6
  platform: ruby
7
7
  authors:
8
- - Alvaro Pereyra
8
+ - Alvaro Pereyra
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-09-16 00:00:00 -05:00
13
+ date: 2011-09-19 00:00:00 -05:00
14
14
  default_executable:
15
15
  dependencies: []
16
16
 
@@ -23,21 +23,22 @@ extensions: []
23
23
  extra_rdoc_files: []
24
24
 
25
25
  files:
26
- - .gitignore
27
- - .rvmrc.example
28
- - Gemfile
29
- - README.md
30
- - Rakefile
31
- - bin/jfugue-4.0.3.jar
32
- - demos/nested_play.rb
33
- - hammelin.gemspec
34
- - lib/hammelin.rb
35
- - lib/hammelin/hammelin.rb
36
- - lib/hammelin/note.rb
37
- - lib/hammelin/notes_range.rb
38
- - lib/hammelin/version.rb
39
- - reference/Main.class
40
- - reference/Main.java
26
+ - .gitignore
27
+ - .rvmrc.example
28
+ - Gemfile
29
+ - README.md
30
+ - Rakefile
31
+ - bin/jfugue-4.0.3.jar
32
+ - demos/each.rb
33
+ - demos/nested_play.rb
34
+ - hammelin.gemspec
35
+ - lib/hammelin.rb
36
+ - lib/hammelin/hammelin.rb
37
+ - lib/hammelin/note.rb
38
+ - lib/hammelin/notes_range.rb
39
+ - lib/hammelin/version.rb
40
+ - reference/Main.class
41
+ - reference/Main.java
41
42
  has_rdoc: true
42
43
  homepage: ""
43
44
  licenses: []
@@ -46,23 +47,23 @@ post_install_message:
46
47
  rdoc_options: []
47
48
 
48
49
  require_paths:
49
- - lib
50
+ - lib
50
51
  required_ruby_version: !ruby/object:Gem::Requirement
51
52
  none: false
52
53
  requirements:
53
- - - ">="
54
- - !ruby/object:Gem::Version
55
- version: "0"
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
56
57
  required_rubygems_version: !ruby/object:Gem::Requirement
57
58
  none: false
58
59
  requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: "0"
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: "0"
62
63
  requirements: []
63
64
 
64
65
  rubyforge_project: hammelin
65
- rubygems_version: 1.5.1
66
+ rubygems_version: 1.5.0
66
67
  signing_key:
67
68
  specification_version: 3
68
69
  summary: Hammelin allows you to play around with JFugue MIDI capabilities