musicality 0.10.1 → 0.11.0

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.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog.md +13 -3
  3. data/README.md +8 -8
  4. data/bin/auditions +241 -0
  5. data/bin/collidify +4 -2
  6. data/bin/musicality +13 -2
  7. data/examples/composition/auto_counterpoint.rb +4 -4
  8. data/examples/composition/part_generator.rb +6 -6
  9. data/examples/composition/scale_exercise.rb +5 -5
  10. data/examples/notation/scores.rb +2 -2
  11. data/examples/notation/twinkle.rb +6 -6
  12. data/examples/notation/twinkle.score +3 -3
  13. data/lib/musicality.rb +6 -4
  14. data/lib/musicality/composition/dsl/part_methods.rb +12 -0
  15. data/lib/musicality/composition/dsl/score_dsl.rb +4 -4
  16. data/lib/musicality/composition/dsl/score_methods.rb +8 -2
  17. data/lib/musicality/notation/model/audition.rb +16 -0
  18. data/lib/musicality/notation/model/score.rb +31 -30
  19. data/lib/musicality/performance/supercollider/conductor.rb +2 -2
  20. data/lib/musicality/performance/supercollider/synthdefs.rb +30 -29
  21. data/lib/musicality/project/auditions_task.rb +28 -0
  22. data/lib/musicality/project/create_tasks.rb +15 -9
  23. data/lib/musicality/project/file_cleaner.rb +22 -5
  24. data/lib/musicality/project/file_raker.rb +29 -21
  25. data/lib/musicality/project/project.rb +218 -32
  26. data/lib/musicality/version.rb +1 -1
  27. data/musicality.gemspec +6 -4
  28. data/spec/composition/dsl/part_methods_spec.rb +24 -0
  29. data/spec/notation/conversion/score_conversion_spec.rb +2 -1
  30. data/spec/notation/conversion/score_converter_spec.rb +23 -23
  31. data/spec/notation/model/score_spec.rb +66 -46
  32. data/spec/performance/conversion/score_collator_spec.rb +29 -29
  33. data/spec/performance/midi/score_sequencing_spec.rb +5 -5
  34. metadata +10 -8
  35. data/lib/musicality/project/load_config.rb +0 -58
@@ -8,25 +8,25 @@ def scale_exercise scale_class, base_pitch, rhythm
8
8
  scale = scale_class.to_pitch_seq(base_pitch)
9
9
  n = scale_class.count
10
10
  m = rhythm.size
11
-
11
+
12
12
  rseq = RepeatingSequence.new((0...m).to_a)
13
13
  aseq = AddingSequence.new([0]*(m-1) + [1])
14
14
  cseq = CompoundSequence.new(:+,[aseq,rseq])
15
15
  pgs = cseq.take(m*n).map {|i| scale.at(i) }
16
16
  notes = make_notes(rhythm, pgs) +
17
17
  make_notes([3/4.to_r,-1/4.to_r], [scale.at(n)])
18
-
18
+
19
19
  rseq = RepeatingSequence.new(n.downto(n+1-m).to_a)
20
20
  aseq = AddingSequence.new([0]*(m-1) + [-1])
21
21
  cseq = CompoundSequence.new(:+,[aseq,rseq])
22
22
  pgs = cseq.take(m*n).map {|i| scale.at(i) }
23
23
  notes += make_notes(rhythm, pgs) +
24
24
  make_notes([3/4.to_r,-1/4.to_r], [scale.at(0)])
25
-
25
+
26
26
  return notes
27
27
  end
28
28
 
29
- score = Score::Tempo.new(FOUR_FOUR,120) do |s|
29
+ score = Score::Tempo.new(120) do |s|
30
30
  s.parts["scale"] = Part.new(Dynamics::MP) do |p|
31
31
  Heptatonic::Prima::MODES.each do |mode_n,scale_class|
32
32
  [[1/4.to_r,1/4.to_r,1/2.to_r]].each do |rhythm|
@@ -38,4 +38,4 @@ score = Score::Tempo.new(FOUR_FOUR,120) do |s|
38
38
  end
39
39
 
40
40
  seq = ScoreSequencer.new(score.to_timed(200)).make_midi_seq("scale" => 1)
41
- File.open("./scale_exercise.mid", 'wb'){ |fout| seq.write(fout) }
41
+ File.open("./scale_exercise.mid", 'wb'){ |fout| seq.write(fout) }
@@ -10,11 +10,11 @@ include Meters
10
10
  #
11
11
 
12
12
  # minimum score, with no parts
13
- s = Score::Tempo.new(FOUR_FOUR, 120)
13
+ s = Score::Tempo.new(120)
14
14
 
15
15
  # add a part
16
16
  s.parts["piano"] = Part.new(MP) do |p|
17
- p.notes = q(C4,C4,G4,G4,A4,A4) + h(G4) +
17
+ p.notes = q(C4,C4,G4,G4,A4,A4) + h(G4) +
18
18
  q(F4,F4,E4,E4,D4,D4) + h(C4)
19
19
  end
20
20
 
@@ -4,25 +4,25 @@ include Meters
4
4
  include Dynamics
5
5
  include Pitches
6
6
 
7
- score = Score::Tempo.new(FOUR_FOUR, 120, title: "Twinkle, Twinkle, Little Star") do |s|
7
+ score = Score::Tempo.new(120, title: "Twinkle, Twinkle, Little Star") do |s|
8
8
  s.parts["rhand"] = Part.new(MF) do |p|
9
9
  a_notes = q(C4,C4,G4,G4,A4,A4) + h(G4) +
10
10
  q(F4,F4,E4,E4,D4,D4) + h(C4)
11
11
  b_notes = q(G4,G4,F4,F4,E4,E4) + h(D4)
12
12
  p.notes += a_notes + b_notes
13
13
  end
14
-
14
+
15
15
  s.parts["lhand"] = Part.new(MF) do |p|
16
16
  Cmaj = [C3,E3,G3]
17
17
  Fmaj = [F2,A2,C3]
18
18
  Gmaj = [G2,B2,D3]
19
-
20
- a_chords = h(Cmaj,Cmaj,Fmaj,Cmaj) +
19
+
20
+ a_chords = h(Cmaj,Cmaj,Fmaj,Cmaj) +
21
21
  h(Fmaj,Cmaj,Gmaj,Cmaj)
22
22
  b_chords = h(Cmaj,Fmaj,Cmaj,Gmaj)
23
23
  p.notes += a_chords + b_chords
24
24
  end
25
-
25
+
26
26
  s.program.push 0...4
27
27
  s.program.push 4...6
28
28
  s.program.push 4...6
@@ -31,4 +31,4 @@ end
31
31
 
32
32
  File.open('twinkle.ly','w'){|f| f.write(score.to_lilypond) }
33
33
  File.open('twinkle.mid','wb'){|f| score.to_midi_seq(200).write(f) }
34
- score.to_osc(200,'twinkle')
34
+ score.to_osc(200,'twinkle')
@@ -4,7 +4,7 @@
4
4
  # include Pitches
5
5
  # ScoreDSL.load('twinkle.score')
6
6
 
7
- tempo_score Meters::FOUR_FOUR, 120 do
7
+ tempo_score 120 do
8
8
  title "Twinkle, Twinkle, Little Star"
9
9
 
10
10
  Cmaj = [C3,E3,G3]
@@ -14,7 +14,7 @@ tempo_score Meters::FOUR_FOUR, 120 do
14
14
  notes(
15
15
  "rhand" => q(C4,C4,G4,G4,A4,A4) + h(G4) +
16
16
  q(F4,F4,E4,E4,D4,D4) + h(C4),
17
- "lhand" => h(Cmaj,Cmaj,Fmaj,Cmaj) +
17
+ "lhand" => h(Cmaj,Cmaj,Fmaj,Cmaj) +
18
18
  h(Fmaj,Cmaj,Gmaj,Cmaj)
19
19
  )
20
20
  end
@@ -30,4 +30,4 @@ tempo_score Meters::FOUR_FOUR, 120 do
30
30
  end
31
31
 
32
32
  File.open('twinkle.ly','w'){|f| f.write(score.to_lilypond) }
33
- File.open('twinkle.mid','wb'){|f| score.to_midi_seq(200).write(f) }
33
+ File.open('twinkle.mid','wb'){|f| score.to_midi_seq(200).write(f) }
data/lib/musicality.rb CHANGED
@@ -26,6 +26,7 @@ require 'musicality/notation/model/meter'
26
26
  require 'musicality/notation/model/meters'
27
27
  require 'musicality/notation/model/key'
28
28
  require 'musicality/notation/model/keys'
29
+ require 'musicality/notation/model/audition'
29
30
  require 'musicality/notation/model/score'
30
31
 
31
32
  require 'treetop'
@@ -82,6 +83,7 @@ require 'musicality/composition/generation/counterpoint_generator'
82
83
  require 'musicality/composition/generation/random_rhythm_generator'
83
84
 
84
85
  require 'musicality/composition/dsl/score_methods'
86
+ require 'musicality/composition/dsl/part_methods'
85
87
  require 'musicality/composition/dsl/score_dsl'
86
88
 
87
89
  require 'musicality/composition/convenience_methods'
@@ -140,15 +142,15 @@ require 'musicality/printing/lilypond/part_engraver'
140
142
  require 'musicality/printing/lilypond/score_engraver'
141
143
  require 'musicality/printing/lilypond/score_engraving'
142
144
 
143
- #
145
+ #
144
146
  # Project
145
147
  #
146
148
 
147
149
  require 'rake'
148
150
  require 'yaml'
149
151
  require 'rake/tasklib'
152
+ require 'musicality/project/project'
150
153
  require 'musicality/project/file_raker'
151
154
  require 'musicality/project/file_cleaner'
152
- require 'musicality/project/project'
153
- require 'musicality/project/load_config'
154
- require 'musicality/project/create_tasks'
155
+ require 'musicality/project/auditions_task'
156
+ require 'musicality/project/create_tasks'
@@ -0,0 +1,12 @@
1
+ module Musicality
2
+
3
+ class Part
4
+ def dynamic_change new_dynamic, transition_dur: 0, offset: 0
5
+ if transition_dur == 0
6
+ change = (transition_dur == 0) ? Change::Immediate.new(new_dynamic) : Change::Gradual.linear(new_dynamic, transition_dur)
7
+ self.dynamic_changes[self.duration + offset] = change
8
+ end
9
+ end
10
+ end
11
+
12
+ end
@@ -1,6 +1,6 @@
1
1
  module Musicality
2
2
 
3
- class ScoreDSL
3
+ class ScoreDSL
4
4
  def self.load fname
5
5
  dsl = ScoreDSL.new
6
6
  dsl.instance_eval(File.read(fname), fname)
@@ -12,10 +12,10 @@ class ScoreDSL
12
12
  @score = nil
13
13
  end
14
14
 
15
- def tempo_score start_meter, start_tempo, &block
16
- @score = Score::Tempo.new(start_meter,start_tempo)
15
+ def tempo_score start_tempo, &block
16
+ @score = Score::Tempo.new(start_tempo)
17
17
  @score.instance_eval(&block)
18
18
  end
19
19
  end
20
20
 
21
- end
21
+ end
@@ -56,7 +56,13 @@ class Score
56
56
  end
57
57
  end
58
58
  end
59
-
59
+
60
+ def audition part_name, program, &block
61
+ audition = Audition.new(part_name, program)
62
+ audition.instance_eval(&block)
63
+ @auditions.push audition
64
+ end
65
+
60
66
  class Tempo < Score
61
67
  def tempo_change new_tempo, transition_dur: 0, offset: 0
62
68
  if transition_dur == 0
@@ -65,7 +71,7 @@ class Score
65
71
  tempo_changes[self.duration + offset] = Change::Gradual.linear(new_tempo, transition_dur)
66
72
  end
67
73
  end
68
-
74
+
69
75
  def meter_change new_meter, offset: 0
70
76
  meter_changes[self.duration + offset] = Change::Immediate.new(new_meter)
71
77
  end
@@ -0,0 +1,16 @@
1
+ module Musicality
2
+
3
+ class Audition
4
+ attr_reader :part_name, :program, :performers
5
+ def initialize part_name, program
6
+ @part_name = part_name
7
+ @program = program.is_a?(Array) ? program : [program]
8
+ @performers = {}
9
+ end
10
+
11
+ def performer name, supercollider_settings
12
+ @performers[name] = supercollider_settings
13
+ end
14
+ end
15
+
16
+ end
@@ -6,13 +6,13 @@ class Score
6
6
 
7
7
  special_packing(:program){|p| p.map {|range| range.to_s }}
8
8
  special_unpacking(:program){|p| p.map {|str| parse_numeric_range(str) }}
9
-
9
+
10
10
  special_packing(:sections){|s| Hash[ s.map {|name,range| [name,range.to_s] } ]}
11
11
  special_unpacking(:sections){|s| Hash[ s.map {|name,str| [name,parse_numeric_range(str)] } ]}
12
12
 
13
- attr_accessor :parts, :sections, :program, :start_key, :key_changes
13
+ attr_accessor :parts, :sections, :program, :start_key, :key_changes, :auditions
14
14
  attr_writer :title, :composer
15
-
15
+
16
16
  def title value = nil
17
17
  if value.nil?
18
18
  return @title
@@ -29,7 +29,7 @@ class Score
29
29
  end
30
30
  end
31
31
 
32
- def initialize parts: {}, program: [], title: nil, composer: nil, sections: {}, start_key: Keys::C_MAJOR, key_changes: {}
32
+ def initialize parts: {}, program: [], title: nil, composer: nil, sections: {}, start_key: Keys::C_MAJOR, key_changes: {}, auditions: []
33
33
  @parts = parts
34
34
  @program = program
35
35
  @title = title
@@ -37,6 +37,7 @@ class Score
37
37
  @sections = sections
38
38
  @start_key = start_key
39
39
  @key_changes = key_changes
40
+ @auditions = auditions
40
41
  yield(self) if block_given?
41
42
  end
42
43
 
@@ -44,11 +45,11 @@ class Score
44
45
  def check_methods
45
46
  [:check_program, :check_parts, :check_start_key, :check_key_changes ]
46
47
  end
47
-
48
+
48
49
  def clone
49
50
  Marshal.load(Marshal.dump(self))
50
51
  end
51
-
52
+
52
53
  def ==(other)
53
54
  return self.class == other.class &&
54
55
  @parts == other.parts && @program == other.program &&
@@ -56,20 +57,20 @@ class Score
56
57
  @title == other.title && @composer == other.composer &&
57
58
  @start_key == other.start_key && @key_changes == other.key_changes
58
59
  end
59
-
60
+
60
61
  def duration
61
62
  @parts.map {|name,part| part.duration }.max || 0.to_r
62
63
  end
63
-
64
+
64
65
  def collated?
65
- @program.size == 1 && @program[0].first == 0
66
+ @program.size == 1 && @program[0].first == 0 && @program[0].last == duration
66
67
  end
67
-
68
+
68
69
  class Timed < Score
69
70
  end
70
71
 
71
72
  # Tempo-based score with meter, bar lines, and a fixed pulse (beat).
72
- #
73
+ #
73
74
  # Offsets and durations are based on note duration, but note duration is
74
75
  # determined by the tempo, which can change.
75
76
  #
@@ -78,23 +79,23 @@ class Score
78
79
  attr_accessor :start_tempo, :tempo_changes, :start_meter, :meter_changes
79
80
 
80
81
  # See Score#initialize for remaining kwargs
81
- def initialize start_meter, start_tempo, tempo_changes: {}, meter_changes: {}, parts: {}, program: [], title: nil, composer: nil, sections: {}, start_key: Keys::C_MAJOR, key_changes: {}
82
+ def initialize start_tempo, tempo_changes: {}, start_meter: Meters::FOUR_FOUR, meter_changes: {}, parts: {}, program: [], title: nil, composer: nil, sections: {}, start_key: Keys::C_MAJOR, key_changes: {}, auditions: []
82
83
  @start_tempo = start_tempo
83
84
  @tempo_changes = tempo_changes
84
85
  @start_meter = start_meter
85
86
  @meter_changes = meter_changes
86
-
87
- super(parts: parts, program: program, title: title, composer: composer, sections: sections, start_key: start_key, key_changes: key_changes)
87
+
88
+ super(parts: parts, program: program, title: title, composer: composer, sections: sections, start_key: start_key, key_changes: key_changes, auditions: auditions)
88
89
  end
89
-
90
+
90
91
  def check_methods
91
92
  super() + [:check_start_tempo, :check_tempo_changes, :check_start_meter, :check_meter_changes]
92
93
  end
93
-
94
+
94
95
  def validatables
95
96
  super() + [ @start_meter ] + @meter_changes.values.map {|v| v.end_value}
96
97
  end
97
-
98
+
98
99
  def ==(other)
99
100
  return super(other) &&
100
101
  @start_tempo == other.start_tempo &&
@@ -115,23 +116,23 @@ class Score
115
116
  end
116
117
 
117
118
  private
118
-
119
+
119
120
  def check_start_tempo
120
121
  if @start_tempo <= 0
121
122
  raise NonPositiveError, "Start tempo (#{@start_tempo}) is not positive"
122
123
  end
123
124
  end
124
-
125
+
125
126
  def check_tempo_changes
126
127
  badtypes = @tempo_changes.select {|k,v| !v.end_value.is_a?(Numeric) }
127
128
  if badtypes.any?
128
129
  raise TypeError, "Found non-numeric tempo change values: #{badtypes}"
129
130
  end
130
-
131
+
131
132
  badvalues = @tempo_changes.select {|k,v| v.end_value <= 0 }
132
133
  if badvalues.any?
133
134
  raise NonPositiveError, "Found non-positive tempo changes values: #{badvalues}"
134
- end
135
+ end
135
136
  end
136
137
 
137
138
  def check_start_meter
@@ -139,7 +140,7 @@ class Score
139
140
  raise TypeError, "Start meter #{@start_meter} is not a Meter object"
140
141
  end
141
142
  end
142
-
143
+
143
144
  def check_meter_changes
144
145
  badtypes = @meter_changes.select {|k,v| !v.end_value.is_a?(Meter) }
145
146
  if badtypes.any?
@@ -152,26 +153,26 @@ class Score
152
153
  end
153
154
  end
154
155
  end
155
-
156
+
156
157
  private
157
-
158
+
158
159
  def check_program
159
160
  non_ranges = @program.select {|x| !x.is_a?(Range) }
160
161
  if non_ranges.any?
161
162
  raise TypeError, "Non-Range program element(s) found: #{non_ranges}"
162
163
  end
163
-
164
+
164
165
  non_increasing = @program.select {|seg| seg.first >= seg.last }
165
166
  if non_increasing.any?
166
167
  raise NonIncreasingError, "Non-increasing program range(s) found: #{non_increasing}"
167
168
  end
168
-
169
+
169
170
  negative = @program.select {|seg| seg.first < 0 || seg.last < 0 }
170
171
  if negative.any?
171
172
  raise NegativeError, "Program range(s) with negative value(s) found: #{negative}"
172
173
  end
173
174
  end
174
-
175
+
175
176
  def check_parts
176
177
  non_parts = @parts.values.select {|x| !x.is_a?(Part) }
177
178
  if non_parts.any?
@@ -184,13 +185,13 @@ class Score
184
185
  raise TypeError, "Start key #{@start_key} is not a Key object"
185
186
  end
186
187
  end
187
-
188
+
188
189
  def check_key_changes
189
190
  badtypes = @key_changes.select {|k,v| !v.end_value.is_a?(Key) }
190
191
  if badtypes.any?
191
192
  raise TypeError, "Found key change values that are not Key objects: #{badtypes}"
192
193
  end
193
-
194
+
194
195
  badoffsets = @key_changes.select {|k,v| k != k.to_i }
195
196
  if badoffsets.any?
196
197
  raise NonIntegerError, "Found key changes at non-integer offsets: #{badoffsets}"
@@ -217,7 +218,7 @@ class Score
217
218
  def self.parse_numeric_range str
218
219
  result = str.match /(\d+([\.\/]\d+)?)([\.]{2,3})(\d+([\.\/]\d+)?)/
219
220
  raise ArgumentError, "string #{str} is not a numeric range" if result.nil?
220
-
221
+
221
222
  dots = result.values_at(3)
222
223
  l_num = parse_numeric(result.values_at(1)[0])
223
224
  r_num = parse_numeric(result.values_at(4)[0])
@@ -14,11 +14,11 @@ class Conductor
14
14
  end]
15
15
  end
16
16
 
17
- def perform base_fpath, selected_parts: @performers.keys, verbose: false, lead_time: 0.1
17
+ def perform base_fpath, selected_parts: @performers.keys, verbose: false, lead_time: 0.1, keep_code: false
18
18
  bundles = bundles(selected_parts, lead_time)
19
19
  fpath = write_sc_code bundles, base_fpath
20
20
  exec_sc_code fpath, bundles.last.time, verbose
21
- File.delete(fpath)
21
+ File.delete(fpath) unless keep_code
22
22
  end
23
23
 
24
24
  def bundles selected_parts = @performers.keys, lead_time
@@ -3,10 +3,13 @@ module SuperCollider
3
3
  module SynthDefs
4
4
 
5
5
  VOLUME_CONTROL = SynthDef.new(name: "volume_control", params: { :in => nil, :out => nil, :control => nil },
6
- body: " Out.ar(out, In.ar(in) * In.kr(control));",
6
+ body: <<-SCLANG,
7
+ var sig = In.ar([in,in+1]) * In.kr(control);
8
+ Out.ar(out,sig);
9
+ SCLANG
7
10
  credit: "James Tunnell",
8
11
  )
9
-
12
+
10
13
  VOLUME_CHANGE = SynthDef.new(name: "volume_change", params: { :vol_bus => nil, :vol => nil, :dur => nil },
11
14
  body: " Out.kr(vol_bus, Line.kr(In.kr(vol_bus), vol, dur));",
12
15
  credit: "James Tunnell",
@@ -203,8 +206,6 @@ SCLANG
203
206
  source: "https://github.com/acarabott/roundhouse-synth-design-course-2014",
204
207
  )
205
208
 
206
- //
207
-
208
209
  ESM = SynthDef.new(name: "esm", params: { :freq => 440, :mix => 0.5, :glide => 0, :cutoff => 20000, :rq => 1, :fdec => 0, :fint => 1,
209
210
  :vel => 1, :fvel => 1, :t_gate => 1, :vdec => 1, :vvel => 0, :od => 0, :mul => 0.1, :pan => 0, :out => 0 },
210
211
  body: <<-SCLANG,
@@ -277,7 +278,7 @@ SCLANG
277
278
  source: "https://github.com/acarabott/roundhouse-synth-design-course-2014",
278
279
  )
279
280
 
280
- PROPHET5_STRINGS = SynthDef.new(name: "prophet5pwmstrings", params: { :out => 0, :freq => 440, :amp => 0.8,
281
+ PROPHET5_STRINGS = SynthDef.new(name: "prophet5pwmstrings", params: { :out => 0, :freq => 440, :amp => 0.8,
281
282
  :gate => 1, :lforate => 3, :lfowidth => 0.1, :cutoff => 12000, :rq => 0.5, :pan => 0.0 },
282
283
  body: <<-SCLANG,
283
284
  var lfo, pulse, filter, env;
@@ -298,7 +299,7 @@ EOS
298
299
  source: "https://github.com/acarabott/roundhouse-synth-design-course-2014",
299
300
  )
300
301
 
301
- OSC_WOBBLE = SynthDef.new(name: "singleoscillatorwobble", params: { :out => 0, :freq => 440, :amp => 0.8,
302
+ OSC_WOBBLE = SynthDef.new(name: "singleoscillatorwobble", params: { :out => 0, :freq => 440, :amp => 0.8,
302
303
  :gate => 1, :lforate => 10, :lfowidth => 0.5, :cutoff => 12000, :rq => 0.5, :pan => 0.0 },
303
304
  body: <<-SCLANG,
304
305
  var lfo, pulse, filter, env;
@@ -319,7 +320,7 @@ EOS
319
320
  source: "https://github.com/acarabott/roundhouse-synth-design-course-2014",
320
321
  )
321
322
 
322
- TRI_BELLS = SynthDef.new(name:"trianglewavebells", params: { :out => 0, :freq => 440, :amp => 0.8, :gate => 1,
323
+ TRI_BELLS = SynthDef.new(name:"trianglewavebells", params: { :out => 0, :freq => 440, :amp => 0.8, :gate => 1,
323
324
  :lforate => 10, :lfowidth => 0.0, :cutoff => 100, :rq => 0.5, :pan => 0.0 },
324
325
  body: <<-SCLANG,
325
326
  var osc1, osc2, vibrato, filter, env;
@@ -367,7 +368,7 @@ EOS
367
368
  source: "https://github.com/acarabott/roundhouse-synth-design-course-2014",
368
369
  )
369
370
 
370
- MOOG_BASS = SynthDef.new(name: "moogbass", params: { :out => 0, :freq => 440, :amp => 0.8, :gate => 1,
371
+ MOOG_BASS = SynthDef.new(name: "moogbass", params: { :out => 0, :freq => 440, :amp => 0.8, :gate => 1,
371
372
  :cutoff => 1000, :gain => 2.0, :lagamount => 0.01, :pan => 0.0 },
372
373
  body: <<-SCLANG,
373
374
  var osc, filter, env, filterenv;
@@ -388,7 +389,7 @@ EOS
388
389
  source: "https://github.com/acarabott/roundhouse-synth-design-course-2014",
389
390
  )
390
391
 
391
- MOOG_BASS2 = SynthDef.new(name: "moogbass2", params: { :out => 0, :freq => 440, :amp => 0.8, :gate => 1,
392
+ MOOG_BASS2 = SynthDef.new(name: "moogbass2", params: { :out => 0, :freq => 440, :amp => 0.8, :gate => 1,
392
393
  :attackTime => 0.2, :fenvamount => 0.5, :cutoff => 1000, :gain => 2.0, :pan => 0.0 },
393
394
  body: <<-SCLANG,
394
395
  var osc, filter, env, filterenv;
@@ -410,7 +411,7 @@ EOS
410
411
  source: "https://github.com/acarabott/roundhouse-synth-design-course-2014",
411
412
  )
412
413
 
413
- PLASTICKY_STRINGS = SynthDef.new(name: "plastickystrings", params: { :out => 0, :freq => 440, :amp => 0.8, :gate => 1,
414
+ PLASTICKY_STRINGS = SynthDef.new(name: "plastickystrings", params: { :out => 0, :freq => 440, :amp => 0.8, :gate => 1,
414
415
  :lforate => 5900, :lfowidth => 0.01, :cutoff => 12000, :rq => 0.5, :pan => 0.0 },
415
416
  body: <<-SCLANG,
416
417
  var lfo, saw, filter, env;
@@ -432,7 +433,7 @@ EOS
432
433
  source: "https://github.com/acarabott/roundhouse-synth-design-course-2014",
433
434
  )
434
435
 
435
- BASS_FOUNDATION = SynthDef.new(name: "bassfoundation", params: { :out => 0, :freq => 440, :amp => 0.8, :gate => 1,
436
+ BASS_FOUNDATION = SynthDef.new(name: "bassfoundation", params: { :out => 0, :freq => 440, :amp => 0.8, :gate => 1,
436
437
  :cutoff => 1000, :rq => 0.5, :pan => 0.0 },
437
438
  body: <<-SCLANG,
438
439
  var osc, filter, env, filterenv;
@@ -453,7 +454,7 @@ EOS
453
454
  source: "https://github.com/acarabott/roundhouse-synth-design-course-2014",
454
455
  )
455
456
 
456
- BASS_HIGHEND = SynthDef.new(name: "basshighend", params: { :out => 0, :freq => 440, :amp => 0.8, :gate => 1,
457
+ BASS_HIGHEND = SynthDef.new(name: "basshighend", params: { :out => 0, :freq => 440, :amp => 0.8, :gate => 1,
457
458
  :cutoff => 3000, :rq => 0.1, :drive => 2.0, :pan => 0.0 },
458
459
  body: <<-SCLANG,
459
460
  var osc, filter, env, filterenv;
@@ -489,7 +490,7 @@ EOS
489
490
  source: "https://github.com/acarabott/roundhouse-synth-design-course-2014",
490
491
  )
491
492
 
492
- WINWOOD_LEAD = SynthDef.new(name: "winwoodlead", params: { :out => 0, :freq => 440, :amp => 0.8, :gate => 1,
493
+ WINWOOD_LEAD = SynthDef.new(name: "winwoodlead", params: { :out => 0, :freq => 440, :amp => 0.8, :gate => 1,
493
494
  :cutoff => 8000, :rq => 0.8, :lfowidth => 0.01, :lforate => 8, :lagamount => 0.01, :pan => 0.0 },
494
495
  body: <<-SCLANG,
495
496
  var pulse, filter, env, lfo;
@@ -512,7 +513,7 @@ EOS
512
513
  source: "https://github.com/acarabott/roundhouse-synth-design-course-2014",
513
514
  )
514
515
 
515
- SITUATION_SYNTH = SynthDef.new(name: "situationsynth", params: { :out => 0, :freq => 440, :amp => 0.1, :gate => 1,
516
+ SITUATION_SYNTH = SynthDef.new(name: "situationsynth", params: { :out => 0, :freq => 440, :amp => 0.1, :gate => 1,
516
517
  :cutoff => 8000, :rq => 0.8, :lfowidth => 0.001, :lforate => 3.3, :pan => -0.1 },
517
518
  body: <<-SCLANG,
518
519
  var pulse, filter, env, filterenv, lfo;
@@ -527,7 +528,7 @@ SITUATION_SYNTH = SynthDef.new(name: "situationsynth", params: { :out => 0, :fre
527
528
  SCLANG
528
529
  )
529
530
 
530
- RES_SQUARES = SynthDef.new(name: "ressquares", params: { :out => 0, :freq => 440, :amp => 0.1, :gate => 1,
531
+ RES_SQUARES = SynthDef.new(name: "ressquares", params: { :out => 0, :freq => 440, :amp => 0.1, :gate => 1,
531
532
  :cutoff => 8000, :rq => 0.8, :pan => -0.1 },
532
533
  body: <<-SCLANG,
533
534
  var pulse, filter, env;
@@ -548,7 +549,7 @@ EOS
548
549
  source: "https://github.com/acarabott/roundhouse-synth-design-course-2014",
549
550
  )
550
551
 
551
- EIGHTTOEIGHT_KICK = SynthDef.new(name: "eightoeightkick", params: { :out => 0, :freq => 440, :amp => 0.1,
552
+ EIGHTTOEIGHT_KICK = SynthDef.new(name: "eightoeightkick", params: { :out => 0, :freq => 440, :amp => 0.1,
552
553
  :ringTime => 10.0, :releaseTime => 1.0, :distortion => 0.1, :pan => -0.1 },
553
554
  body: <<-SCLANG,
554
555
  var impulse, filter, env;
@@ -569,7 +570,7 @@ EOS
569
570
  source: "https://github.com/acarabott/roundhouse-synth-design-course-2014",
570
571
  )
571
572
 
572
- TONEWHEEL_TWO = SynthDef.new(name: "tonewheeltwo", params: { :out => 0, :freq => 440, :amp => 0.1, :gate => 1,
573
+ TONEWHEEL_TWO = SynthDef.new(name: "tonewheeltwo", params: { :out => 0, :freq => 440, :amp => 0.1, :gate => 1,
573
574
  :lforate => 4.85, :lfowidth => 0.1, :cutoff => 5000, :rq => 0.25, :pan => 0.0 },
574
575
  body: <<-SCLANG,
575
576
  //tone wheel organ emulation via two oscillators pp. 50-51
@@ -593,7 +594,7 @@ EOS
593
594
  source: "https://github.com/acarabott/roundhouse-synth-design-course-2014",
594
595
  )
595
596
 
596
- EVERYTHING_RHODES = SynthDef.new(name: "everythingrhodes", params: { :out => 0, :freq => 440, :amp => 0.1, :gate => 1,
597
+ EVERYTHING_RHODES = SynthDef.new(name: "everythingrhodes", params: { :out => 0, :freq => 440, :amp => 0.1, :gate => 1,
597
598
  :lforate => 1.85, :lfowidth => 0.5, :cutoff => 2000, :rq => 0.2, :pan => 0.0 },
598
599
  body: <<-SCLANG,
599
600
  var pulse, filter, env;
@@ -614,7 +615,7 @@ EOS
614
615
  source: "https://github.com/acarabott/roundhouse-synth-design-course-2014",
615
616
  )
616
617
 
617
- SPACE_THEREMIN = SynthDef.new(name: "spacetheremin", params: { :out => 0, :freq => 440, :amp => 0.1,
618
+ SPACE_THEREMIN = SynthDef.new(name: "spacetheremin", params: { :out => 0, :freq => 440, :amp => 0.1,
618
619
  :gate => 1, :lforate => 6, :lfowidth => 0.5, :cutoff => 4000, :rq => 0.25, :lagTime => 0.1, :pan => 0.0 },
619
620
  body: <<-SCLANG,
620
621
  var lfo, osc, filter, env;
@@ -635,7 +636,7 @@ EOS
635
636
  source: "https://github.com/acarabott/roundhouse-synth-design-course-2014",
636
637
  )
637
638
 
638
- FAT_VELOCITY_BASS = SynthDef.new(name: "fatvelocitybass", params: { :out => 0, :freq => 440, :amp => 0.5,
639
+ FAT_VELOCITY_BASS = SynthDef.new(name: "fatvelocitybass", params: { :out => 0, :freq => 440, :amp => 0.5,
639
640
  :gate => 1, :cutoff => 2000, :rq => 0.15, :lagTime => 0.01, :pan => 0.0 },
640
641
  body: <<-SCLANG,
641
642
  var lfo, osc, filter, env;
@@ -990,7 +991,7 @@ SCLANG
990
991
  source: "https://github.com/supercollider-quarks/SynthDefPool",
991
992
  )
992
993
 
993
- CS80_LEAD_MH = SynthDef.new(name: "cs80lead_mh", params: { :freq => 880, :amp => 0.5, :att => 0.75, :decay => 0.5,
994
+ CS80_LEAD_MH = SynthDef.new(name: "cs80lead_mh", params: { :freq => 880, :amp => 0.5, :att => 0.75, :decay => 0.5,
994
995
  :sus => 0.8, :rel => 1.0, :fatt => 0.75, :fdecay => 0.5, :fsus => 0.8, :frel => 1.0, :cutoff => 200, :pan => 0,
995
996
  :dtune => 0.002, :vibrate => 4, :vibdepth => 0.015, :gate => 1, :ratio => 1,:out => 0 },
996
997
  body: <<-SCLANG,
@@ -1030,7 +1031,7 @@ CYMBAL_808 = SynthDef.new(name: "cymbal808", params: { :out => 0, :baseFreq => 3
1030
1031
  signal = signal + FreeVerb.ar(signal);
1031
1032
  signal = signal * EnvGen.ar(Env.new([0, 1, 0.4, 0, 0], [2, time, 50, 500], [0, -0.5, 0, -50]), timeScale:(1/1000), doneAction:2);
1032
1033
  signal = [signal, DelayN.ar(signal, 0.005, 0.005)];
1033
- OffsetOut.ar(out, signal*4*amp);
1034
+ OffsetOut.ar(out, signal*amp ! 2);
1034
1035
  SCLANG
1035
1036
  credit: "Published on sc-users 2007-08-25 by Ryan Brown",
1036
1037
  source: "https://github.com/supercollider-quarks/SynthDefPool",
@@ -1571,7 +1572,7 @@ SCLANG
1571
1572
  )
1572
1573
 
1573
1574
 
1574
- SynthDef.new(name: "sawpulse", params: { :out => 0, :freq => 440, :gate => 0.5, :plfofreq => 6, :mw => 0, :ffreq => 2000, :rq => 0.3, :freqlag => 0.05, :amp => 1 },
1575
+ SAWPULSE = SynthDef.new(name: "sawpulse", params: { :out => 0, :freq => 440, :gate => 0.5, :plfofreq => 6, :mw => 0, :ffreq => 2000, :rq => 0.3, :freqlag => 0.05, :amp => 1 },
1575
1576
  body: <<-SCLANG,
1576
1577
  var sig, plfo, fcurve;
1577
1578
  plfo = SinOsc.kr(plfofreq, mul:mw, add:1);
@@ -1588,7 +1589,7 @@ SCLANG
1588
1589
  source: "https://github.com/bwestergard/supercollider-experiments",
1589
1590
  )
1590
1591
 
1591
- SynthDef.new(name: "sawpulse2", params: { :out => 0, :freq => 440, :gate => 0.5, :plfofreq => 6, :mw => 0, :ffreq => 2000, :rq => 0.3, :freqlag => 0.05, :amp => 1 },
1592
+ SAWPULSE2 = SynthDef.new(name: "sawpulse2", params: { :out => 0, :freq => 440, :gate => 0.5, :plfofreq => 6, :mw => 0, :ffreq => 2000, :rq => 0.3, :freqlag => 0.05, :amp => 1 },
1592
1593
  body: <<-SCLANG,
1593
1594
  var sig, plfo, fcurve;
1594
1595
  plfo = SinOsc.kr(plfofreq, mul:mw, add:1);
@@ -1603,7 +1604,7 @@ SCLANG
1603
1604
  source: "https://github.com/bwestergard/supercollider-experiments",
1604
1605
  )
1605
1606
 
1606
- SynthDef.new(name: "sinepluck", params: { :out => 0, :freq => 440, :amp => 1, :dur => nil },
1607
+ SINEPLUCK = SynthDef.new(name: "sinepluck", params: { :out => 0, :freq => 440, :amp => 1, :dur => nil },
1607
1608
  body: <<-SCLANG,
1608
1609
  var mod,tone;
1609
1610
  amp = amp * 0.8;
@@ -1617,7 +1618,7 @@ SCLANG
1617
1618
  source: "https://github.com/bwestergard/supercollider-experiments",
1618
1619
  )
1619
1620
 
1620
- SynthDef.new(name: "snare", params: { :amp => 1, :dur => 0.05, :out => 0 },
1621
+ SNARE3 = SynthDef.new(name: "snare", params: { :amp => 1, :dur => 0.05, :out => 0 },
1621
1622
  body: <<-SCLANG,
1622
1623
  dur = dur * 16;
1623
1624
  Out.ar(out, amp * XLine.ar(2,1/1000,dur) * BPF.ar(PinkNoise.ar(0.8), XLine.ar(20000,1000,dur, doneAction:2), 0.8).dup);
@@ -1625,7 +1626,7 @@ SCLANG
1625
1626
  source: "https://github.com/bwestergard/supercollider-experiments",
1626
1627
  )
1627
1628
 
1628
- SynthDef.new(name: "kick", params: { :out => 0, :amp => 1, :dur => 0.05 },
1629
+ KICK1 = SynthDef.new(name: "kick", params: { :out => 0, :amp => 1, :dur => 0.05 },
1629
1630
  body: <<-SCLANG,
1630
1631
  var tone;
1631
1632
  tone = SinOsc.ar(XLine.ar(800,2,dur*4, mul: 0.2, doneAction:2));
@@ -1635,7 +1636,7 @@ SCLANG
1635
1636
  )
1636
1637
 
1637
1638
 
1638
- SynthDef.new(name: "poly1", params: { :out => 0, :gate => 1, :freq => 440 },
1639
+ POLY1 = SynthDef.new(name: "poly1", params: { :out => 0, :gate => 1, :freq => 440 },
1639
1640
  body: <<-SCLANG,
1640
1641
  var aEnv,fEnv,osc1, osc2,flt;
1641
1642
  aEnv=EnvGen.kr(Env.asr(0.2,1,0.1), gate, doneAction:2);
@@ -1651,4 +1652,4 @@ SCLANG
1651
1652
 
1652
1653
  end
1653
1654
  end
1654
- end
1655
+ end