hammelin 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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