rhythmruby 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +8 -5
- data/lib/rhythmruby.rb +2 -1
- data/lib/rhythmruby/LogicalRhythms.rb +76 -0
- data/lib/rhythmruby/version.rb +1 -1
- metadata +3 -2
data/README.md
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
RhythmRuby: Midi rhythms through String manipulation
|
2
2
|
====================================================
|
3
3
|
|
4
|
-
**Author**: Luuk van der Velden, (Amsterdam, 2013)
|
5
|
-
**Website**:
|
4
|
+
**Author**: Luuk van der Velden, (Amsterdam, 2013)
|
5
|
+
**Website**: http://rubygems.org/gems/rhythmruby
|
6
6
|
**Git**: https://github.com/Lvelden/rhythmruby.git
|
7
|
+
**Docs**: http://rubydoc.info/gems/rhythmruby/0.1.2/frames
|
8
|
+
**Dependency**: midilib by Jim Menard
|
7
9
|
|
8
10
|
Synopsis
|
9
11
|
--------
|
@@ -26,18 +28,19 @@ StringCompiler Class allows the creation of rhythm snippets and compiles them in
|
|
26
28
|
These snippets capture the repetitive aspects of most rhythms.
|
27
29
|
|
28
30
|
**3. countBase** is the rhythmical length that is assigned to one symbol in a string.
|
29
|
-
It is measured in
|
31
|
+
It is measured in quarter note lengths (relative to bpm), thus countBase: 1.0, means one quarter note per symbol.
|
30
32
|
|
31
33
|
Classes
|
32
34
|
-------
|
33
35
|
The **RhythmCompiler** (class) generates rhythm snippets and combines these into rhythm strings.
|
36
|
+
**LogicalRhythms** (class) allows logical interaction between different rhythm strings.
|
34
37
|
These can be parsed to MIDI ready data by the **RhythmParser** (class).
|
35
38
|
The parsed output can be written to a MIDI file by the **MidiWriter** (class instance).
|
36
39
|
|
37
40
|
Examples and Docs
|
38
41
|
-----------------
|
39
42
|
|
40
|
-
Check out the examples provided and the documentation
|
43
|
+
Check out the examples provided and the documentation. The examples are aimed at
|
41
44
|
creating single and multi instrument rhythms. For instance **Meshuggah_example.rb** explains the creation of the
|
42
45
|
intro rhythm of 'Perpetual Black Second' by Meshuggah (Nothing, 2002), using ruby scripting.
|
43
46
|
|
@@ -73,7 +76,7 @@ pmidi. pmidi can send the MIDI events to any ALSA channel f.i. the MIDI-in of th
|
|
73
76
|
is a nice drum sampler and sequencer. In this way you can listen to the rhythms you create without leaving your
|
74
77
|
IDE or editor.
|
75
78
|
|
76
|
-
|
79
|
+
Rationale
|
77
80
|
--------
|
78
81
|
|
79
82
|
RhythmRuby's strength lies in the rhythm string abstraction. It allows easy computer
|
data/lib/rhythmruby.rb
CHANGED
@@ -0,0 +1,76 @@
|
|
1
|
+
class LogicalRhythms
|
2
|
+
@@eventMarker = '#' # symbol which denotes event or hit
|
3
|
+
@@silenceMarker = '-' # symbol that denotes silence
|
4
|
+
|
5
|
+
# logical exlusion of two rhythms, removes events from slave simultaneous
|
6
|
+
# with an event in the master rhythm
|
7
|
+
# @param [String] masterRhythm rhythm to intersect with
|
8
|
+
# @param [String] slaveRhythm rhythm to intersect
|
9
|
+
# @return [String] intersected slaveRhythm
|
10
|
+
def self.Exclusion(masterRhythm, slaveRhythm)
|
11
|
+
masterRhythm.split("").zip(slaveRhythm.split("")).each_with_index do
|
12
|
+
|symbols, index|
|
13
|
+
master,slave = symbols
|
14
|
+
if master == @@eventMarker && slave == @@eventMarker # if both have an event
|
15
|
+
slaveRhythm[index] = @@silenceMarker # replace event with silence
|
16
|
+
end
|
17
|
+
end
|
18
|
+
return slaveRhythm
|
19
|
+
end
|
20
|
+
|
21
|
+
# logical XOR of two rhythms, true except both true
|
22
|
+
# @param [String] masterRhythm rhythm to intersect with
|
23
|
+
# @param [String] slaveRhythm rhythm to intersect
|
24
|
+
# @return [String] intersected slaveRhythm
|
25
|
+
def self.XOR(rhythmA, rhythmB)
|
26
|
+
resultRhythm = ""
|
27
|
+
rhythmA.split("").zip(rhythmB.split("")).each do
|
28
|
+
|symA, symB|
|
29
|
+
if symA == @@eventMarker && symB == @@eventMarker # if both have an event
|
30
|
+
resultRhythm += @@silenceMarker # replace event with silence
|
31
|
+
elsif symA == @@eventMarker or symB == @@eventMarker
|
32
|
+
resultRhythm += @@eventMarker
|
33
|
+
else
|
34
|
+
resultRhythm += @@silenceMarker
|
35
|
+
end
|
36
|
+
end
|
37
|
+
return resultRhythm
|
38
|
+
end
|
39
|
+
|
40
|
+
# logical OR of two rhythms, thus event in result rhythm, when at least one
|
41
|
+
# of two original rhythms has an event (functionally the same as addition)
|
42
|
+
# @param [String] rhythmA, one of the rhythms to or
|
43
|
+
# @param [String] rhythmB, one of the rhythms to or
|
44
|
+
# @return [String] resultRhyhtm, result of logical or
|
45
|
+
def self.OR(rhythmA, rhythmB)
|
46
|
+
resultRhythm = ""
|
47
|
+
|
48
|
+
rhythmA.split("").zip(rhythmB.split("")).each do
|
49
|
+
|symA, symB|
|
50
|
+
if symA == @@eventMarker or symB == @@eventMarker
|
51
|
+
resultRhythm += @@eventMarker
|
52
|
+
else
|
53
|
+
resultRhythm += @@silenceMarker
|
54
|
+
end
|
55
|
+
end
|
56
|
+
return resultRhythm
|
57
|
+
end
|
58
|
+
|
59
|
+
# logical AND of two rhythms, returns only events present in both rhythms
|
60
|
+
# @param [String] rhythmA, one of the rhythms to and
|
61
|
+
# @param [String] rhythmB, one of the rhythms to and
|
62
|
+
# @return [String] resultRhythm, result of logical and
|
63
|
+
def self.AND(rhythmA, rhythmB)
|
64
|
+
resultRhythm = ""
|
65
|
+
rhythmA.split("").zip(rhythmB.split("")).each do
|
66
|
+
|symA, symB|
|
67
|
+
if symA == @@eventMarker and symB == @@eventMarker
|
68
|
+
resultRhythm += @@eventMarker
|
69
|
+
else
|
70
|
+
resultRhythm += @@silenceMarker
|
71
|
+
end
|
72
|
+
end
|
73
|
+
return resultRhythm
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
data/lib/rhythmruby/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rhythmruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-01-
|
12
|
+
date: 2013-01-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: midilib
|
@@ -44,6 +44,7 @@ files:
|
|
44
44
|
- examples/drum_kit_example.rb
|
45
45
|
- examples/single_rhythm_example.rb
|
46
46
|
- lib/rhythmruby.rb
|
47
|
+
- lib/rhythmruby/LogicalRhythms.rb
|
47
48
|
- lib/rhythmruby/MidiWriter.rb
|
48
49
|
- lib/rhythmruby/RhythmCompiler.rb
|
49
50
|
- lib/rhythmruby/RhythmParser.rb
|