first commit
						commit
						db5fce2c18
					
				| @ -0,0 +1,178 @@ | ||||
| \version "2.19.81" | ||||
| 
 | ||||
| 
 | ||||
| \paper { | ||||
|   #(set-paper-size "a4" 'portrait) | ||||
|   top-margin = 1 \cm | ||||
|   bottom-margin = 1 \cm | ||||
|   left-margin = 2.5 \cm | ||||
|   ragged-bottom = ##t | ||||
|   page-breaking = #ly:minimal-breaking | ||||
|    | ||||
|   top-system-spacing = | ||||
|   #'((basic-distance . 15 ) | ||||
|   (minimum-distance . 15 ) | ||||
|   (padding . 0 ) | ||||
|   (stretchability . 0)) | ||||
|    | ||||
|   system-system-spacing =  | ||||
|   #'((basic-distance . 30 ) | ||||
|   (minimum-distance . 30 ) | ||||
|   (padding . 0 ) | ||||
|   (stretchability . 0)) | ||||
|    | ||||
|   last-bottom-spacing = | ||||
|   #'((basic-distance . 15 ) | ||||
|   (minimum-distance . 15 ) | ||||
|   (padding . 0 ) | ||||
|   (stretchability . 0)) | ||||
|    | ||||
|   %min-systems-per-page = 5 | ||||
|   %systems-per-page = 5 | ||||
|   %max-systems-per-page = 5 | ||||
|    | ||||
|   print-page-number = ##t | ||||
|   oddHeaderMarkup = \markup { \on-the-fly #not-first-page "(cic)" } | ||||
|   evenHeaderMarkup = \markup { \on-the-fly #not-first-page "(cic)" } | ||||
|   oddFooterMarkup = \markup { \fill-line { | ||||
|     \on-the-fly #not-first-page  | ||||
|     \concat { | ||||
|       "-" | ||||
|       \fontsize #1.5 | ||||
|       \on-the-fly #print-page-number-check-first | ||||
|       \fromproperty #'page:page-number-string | ||||
|       "-"}}} | ||||
|   evenFooterMarkup = \markup { \fill-line { | ||||
|     \on-the-fly #not-first-page  | ||||
|     \concat {  | ||||
|       "-"  | ||||
|       \fontsize #1.5 | ||||
|       \on-the-fly #print-page-number-check-first | ||||
|       \fromproperty #'page:page-number-string | ||||
|       "-"}}} | ||||
| } | ||||
| 
 | ||||
| \header { | ||||
|   title = \markup { \italic {Counterfeiting in Colonial Connecticut}} | ||||
|   %subtitle = \markup { \normal-text { from \italic{a history of the domino the problem}}} | ||||
|   composer = \markup \right-column {"michael winter" "(gatlinburg, tennessee; 2020)"} | ||||
|   tagline = "" | ||||
| }  | ||||
| 
 | ||||
| #(set-global-staff-size 11) | ||||
| 
 | ||||
| \layout { | ||||
|   indent = 0.0\cm | ||||
|   line-width = 17\cm  | ||||
|   ragged-last = ##f | ||||
|   ragged-right = ##f | ||||
|    | ||||
|   \context { | ||||
|     \Score | ||||
|       %\remove "Mark_engraver"  | ||||
|       %\override BarNumber.extra-offset = #'(0 . 4) | ||||
|       \override BarNumber.stencil = #(make-stencil-circler 0.1 0.25 ly:text-interface::print) | ||||
|       \override Stem.stemlet-length = #0.75 | ||||
|       %\override SpacingSpanner.base-shortest-duration = #(ly:make-moment 1/4) | ||||
|       %\override SpacingSpanner.common-shortest-duration = #(ly:make-moment 1/30) | ||||
|       proportionalNotationDuration = #(ly:make-moment 1/16) | ||||
|       %\override SpacingSpanner.strict-note-spacing = ##t | ||||
|       %\override SpacingSpanner.uniform-stretching = ##t | ||||
|       %\override TextSpanner.breakable = ##t | ||||
|       \remove "Separating_line_group_engraver" | ||||
|       %\override PaperColumn.used = ##t | ||||
|       %\override DynamicTextSpanner.style = #'none | ||||
|   } | ||||
|   \context { | ||||
|     \Staff | ||||
|      | ||||
|     \override VerticalAxisGroup.staff-staff-spacing = | ||||
|       #'((basic-distance . 13 ) | ||||
|       (minimum-distance . 13 ) | ||||
|       (padding . 0 ) | ||||
|       (stretchability . 0)) | ||||
|        | ||||
|       %\consists "Mark_engraver" | ||||
|       %\remove "Dot_column_engraver" | ||||
|       %\remove "Time_signature_engraver" | ||||
|       %\remove "Clef_engraver" | ||||
|       %\override StaffSymbol.line-count = #1 | ||||
|       %\override NoteHead.no-ledgers = ##t | ||||
|       %\override RestCollision.positioning-done = #merge-rests-on-positioning | ||||
|       \override RehearsalMark.X-offset = #1 | ||||
|       \override RehearsalMark.Y-offset = #4 | ||||
|       \override VerticalAxisGroup.default-staff-staff-spacing = | ||||
|       #'((basic-distance . 16 ) | ||||
|       (minimum-distance . 16 ) | ||||
|       (padding . 0 ) | ||||
|       (stretchability . 0)) | ||||
|        | ||||
|       \override TimeSignature.font-size = #2 | ||||
|       \override TimeSignature.break-align-symbol = #'clef | ||||
|       \override TimeSignature.X-offset = | ||||
|         #ly:self-alignment-interface::x-aligned-on-self | ||||
|       \override TimeSignature.self-alignment-X = #LEFT | ||||
|       %\override TimeSignature.after-line-breaking = | ||||
|       %  #shift-right-at-line-begin | ||||
|       \override TimeSignature.Y-offset = #9 | ||||
|       \override TimeSignature.extra-offset = #'(2 . 0) | ||||
|   } | ||||
|   \context { | ||||
|     \StaffGroup | ||||
|     \name "SemiStaffGroup" | ||||
|     \consists "Span_bar_engraver" | ||||
|     \override SpanBar.stencil = | ||||
|       #(lambda (grob)  | ||||
|         (if (string=? (ly:grob-property grob 'glyph-name) "|") | ||||
|             (set! (ly:grob-property grob 'glyph-name) "")) | ||||
|         (ly:span-bar::print grob)) | ||||
|   } | ||||
|   \context { | ||||
|     \Score | ||||
|     \accepts SemiStaffGroup | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| \midi { } | ||||
| 
 | ||||
| 
 | ||||
| %showLastLength = R1*128 | ||||
| \score{ | ||||
| \new Score  | ||||
|   << | ||||
|     \new SemiStaffGroup { | ||||
|     << | ||||
|     \new Staff \with { | ||||
|       instrumentName = "oversound" | ||||
|       shortInstrumentName = "oversound" | ||||
|       midiInstrument = #"clarinet" | ||||
|     } | ||||
|     << | ||||
|       \include "includes/cicc_high.ly" | ||||
|     >> | ||||
| 
 | ||||
|     \new Staff \with { | ||||
|       instrumentName = "guitar" | ||||
|       shortInstrumentName = "guitar" | ||||
|       midiInstrument = #"electric guitar (jazz)" | ||||
|     } | ||||
|     << | ||||
|       \include "includes/cicc_guitar.ly" | ||||
|     >> | ||||
|      | ||||
|     \new Staff \with { | ||||
|       instrumentName = "undersound" | ||||
|       shortInstrumentName = "undersound" | ||||
|       midiInstrument = #"contrabass" | ||||
|     } | ||||
|     << | ||||
|       \include "includes/cicc_low.ly" | ||||
|     >> | ||||
|      | ||||
|     >> | ||||
|     } | ||||
|   >> | ||||
|    | ||||
|   \layout{} | ||||
|   \midi{} | ||||
| } | ||||
											
												Binary file not shown.
											
										
									
								
											
												Binary file not shown.
											
										
									
								
											
												
													File diff suppressed because one or more lines are too long
												
											
										
									
								| @ -0,0 +1,22 @@ | ||||
| 
 | ||||
| {  | ||||
| \set Score.markFormatter = #format-mark-box-numbers  \tempo 8 = 90 | ||||
|  \numericTimeSignature \time 4/4 | ||||
|  \clef "treble^8" | ||||
|   \bar "||" \mark \markup { \bold \box 1.1 }  | ||||
| \time 4/4 | ||||
| f''''1 ~ | f''''1 | R1 | r2. f''''4 ~ | f''''1 ~ | f''''1 ~ | f''''1 ~ | f''''2 ~ f''''8  [ r8  ] r4 | f''''1 ~ | f''''1 ~ | f''''8  [ r8  ] r2. | R1 | r4 r8  [ f''''8  ] ~ f''''2 ~ | f''''2. r4 | r8  [ f''''8  ] ~ f''''2. ~ | f''''1 ~ | f''''1 ~ | f''''1 | r4 r8  [ f''''8  ] ~ f''''2 ~ | f''''1 ~ | f''''4 ~ f''''8  [ r8  ] r2 | r2 r8  [ f''''8  ] ~ f''''4 ~ | f''''1 ~ | f''''2 ~ f''''8  [ r8  ] r4 | R1 | f''''1 ~ | f''''2. r4 | R1 | R1 | R1 | R1 | R1 | R1 |   | ||||
| \time 2/4 | ||||
| r2 |   \bar "||" \mark \markup { \bold \box 1.2 }  | ||||
| \time 4/4 | ||||
| r8  [ d''''8  ] ~ d''''2. ~ | d''''2 r4 r8  [ d''''8  ] ~ | d''''1 ~ | d''''2 ~ d''''8  [ r8  ] r4 | d''''1 ~ | d''''1 ~ | d''''1 ~ | d''''2. ~ d''''8  [ r8  ] | R1 | r2 d''''2 ~ | d''''2. r4 | R1 | r4 r8  [ d''''8  ] ~ d''''2 ~ | d''''1 ~ | d''''4 ~ d''''8  [ r8  ] r4 d''''4 ~ | d''''1 ~ | d''''1 ~ | d''''1 ~ | d''''2 ~ d''''8  [ r8  ] r4 | R1 | r4 d''''2. ~ | d''''1 ~ | d''''8  [ r8  ] r2. | r2 d''''2 ~ | d''''1 ~ | d''''8  [ r8  ] r4 d''''2 ~ | d''''1 ~ | d''''1 ~ | d''''1 ~ | d''''1 ~ | d''''1 ~ | d''''2. r4 | R1 | r4 d''''2. ~ | d''''1 | r4 r8  [ d''''8  ] ~ d''''2 ~ | d''''2 ~ d''''8  [ r8  ] r4 | d''''1 ~ | d''''4 r2. | R1 | R1 | R1 | R1 | R1 | R1 |   \bar "||" \mark \markup { \bold \box 1.3 }r1 | r2 r8  [ f''''8  ] ~ f''''4 ~ | f''''1 | r4 r8  [ f''''8  ] ~ f''''2 ~ | f''''1 ~ | f''''4 ~ f''''8  [ r8  ] r4 f''''4 ~ | f''''1 ~ | f''''1 | R1 | R1 |   \bar ".|" \mark \markup { \bold \box 1.4 }r1 | r2 r8  [ f''''8  ] ~ f''''4 ~ | f''''1 ~ | f''''2 r2 | R1 | r8  [ f''''8  ] ~ f''''2. ~ | f''''1 ~ | f''''1 ~ | f''''1 ~ | f''''1 ~ | f''''1 ~ | f''''4 ~ f''''8  [ r8  ] r2 | R1 | f''''1 ~ | f''''2. ~ f''''8  [ r8  ] | R1 | R1 | R1 | R1 | R1 | R1 |   | ||||
| \time 3/4 | ||||
| r2. |   \bar "|.|" \mark \markup { \bold \box 2.1 } | ||||
| \pageBreak  | ||||
|   | ||||
| \time 4/4 | ||||
|  R1 | r2 r8  [ f''''8  ] ~ f''''4 ~ | f''''1 ~ | f''''2 ~ f''''8  [ r8  ] r4 | f''''1 ~ | f''''1 ~ | f''''4 ~ f''''8  [ r8  ] r2 | R1 | r4 r8  [ f''''8  ] ~ f''''2 ~ | f''''2. ~ f''''8  [ r8  ] | R1 | r2 r8  [ f''''8  ] ~ f''''4 ~ | f''''1 ~ | f''''1 ~ | f''''2. r4 | R1 | f''''1 ~ | f''''4 ~ f''''8  [ r8  ] r4 f''''4 ~ | f''''1 ~ | f''''1 ~ | f''''1 ~ | f''''1 ~ | f''''2 r2 | R1 | r8  [ f''''8  ] ~ f''''2. ~ | f''''1 | R1 | R1 | R1 | R1 | R1 |   | ||||
| \time 3/4 | ||||
| r2. |   \bar "||" \mark \markup { \bold \box 2.2 }  | ||||
| \time 4/4 | ||||
|  R1 | r2 r8  [ d''''8  ] ~ d''''4 ~ | d''''1 ~ | d''''2 r2 | R1 | r2. d''''4 ~ | d''''1 ~ | d''''1 ~ | d''''1 ~ | d''''1 ~ | d''''1 ~ | d''''1 | r4 r8  [ d''''8  ] ~ d''''2 ~ | d''''1 ~ | d''''4 r4 r8  [ d''''8  ] ~ d''''4 ~ | d''''1 ~ | d''''4 r4 r8  [ d''''8  ] ~ d''''4 ~ | d''''1 | R1 | R1 | R1 | R1 |   \bar "||" \mark \markup { \bold \box 2.3 }r2. f''''4 ~ | f''''1 ~ | f''''2. ~ f''''8  [ r8  ] | R1 | r2 r8  [ f''''8  ] ~ f''''4 ~ | f''''1 ~ | f''''1 ~ | f''''1 ~ | f''''1 ~ | f''''1 ~ | f''''2. ~ f''''8  [ r8  ] | r4 f''''2. ~ | f''''2 r4 r8  [ f''''8  ] ~ | f''''1 ~ | f''''4 r4 r8  [ f''''8  ] ~ f''''4 ~ | f''''1 ~ | f''''1 ~ | f''''1 ~ | f''''2 r2 | R1 | R1 | R1 | R1 |   \bar ".|" \mark \markup { \bold \box 2.4 }r1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1  ] \bar "|." }  | ||||
| @ -0,0 +1,22 @@ | ||||
| 
 | ||||
| {  | ||||
| \set Score.markFormatter = #format-mark-box-numbers  \tempo 8 = 90 | ||||
|  \override Staff.TimeSignature #'stencil = ##f \numericTimeSignature \time 4/4 | ||||
|  \clef bass | ||||
|   \bar "||" \mark \markup { \bold \box 1.1 }  | ||||
| \time 4/4 | ||||
|  <<{ d,4 ^ \markup{ 0.0 }  } \new Voice { \voiceTwo d,4  }>> \oneVoice r2. | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 |   | ||||
| \time 2/4 | ||||
| r2 |   \bar "||" \mark \markup { \bold \box 1.2 }  | ||||
| \time 4/4 | ||||
|  <<{ a,,4 ^ \markup{ 5.0 }  } \new Voice { \voiceTwo a,,4  }>> \oneVoice r2. | R1 | R1 | R1 | r2  <<{ a,,4 ^ \markup{ 4.4 }  } \new Voice { \voiceTwo a,,4  }>> \oneVoice r4 | R1 | R1 | R1 | R1 | r2.  <<{ a,,4 ^ \markup{ 3.9 }  } \new Voice { \voiceTwo a,,4  }>> \oneVoice | R1 | R1 | R1 | R1 | R1 | r2  <<{ a,,4 ^ \markup{ 3.3 }  } \new Voice { \voiceTwo a,,4  }>> \oneVoice r4 | R1 | R1 | R1 | R1 | R1 |  <<{ a,,4 ^ \markup{ 2.8 }  } \new Voice { \voiceTwo a,,4  }>> \oneVoice r2. | R1 | R1 | R1 |  <<{ a,,4 ^ \markup{ 2.2 }  } \new Voice { \voiceTwo a,,4  }>> \oneVoice r2. | R1 | R1 | R1 |  <<{ a,,4 ^ \markup{ 1.7 }  } \new Voice { \voiceTwo a,,4  }>> \oneVoice r2. | R1 | R1 | R1 | r4  <<{ a,,4 ^ \markup{ 1.1 }  } \new Voice { \voiceTwo a,,4  }>> \oneVoice r2 | R1 | R1 | R1 | R1 | r2.  <<{ a,,4 ^ \markup{ 0.6 }  } \new Voice { \voiceTwo a,,4  }>> \oneVoice | R1 | R1 | R1 | R1 | R1 | R1 |   \bar "||" \mark \markup { \bold \box 1.3 } <<{ d,4 ^ \markup{ 0.0 }  } \new Voice { \voiceTwo d,4  }>> \oneVoice r2. | R1 | r2.  <<{ f,,4 ^ \markup{ 0.0 }  } \new Voice { \voiceTwo f,,4  }>> \oneVoice | R1 | R1 | R1 |  <<{ e,,4 ^ \markup{ 0.0 }  } \new Voice { \voiceTwo e,,4  }>> \oneVoice r2. | R1 | R1 | R1 |   \bar ".|" \mark \markup { \bold \box 1.4 } <<{ d,4 ^ \markup{ -36.7 }  } \new Voice { \voiceTwo d,4  }>> \oneVoice r2. | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 |   | ||||
| \time 3/4 | ||||
| r2. |   \bar "|.|" \mark \markup { \bold \box 2.1 } | ||||
| \pageBreak  | ||||
|   | ||||
| \time 4/4 | ||||
|  <<{ d,4 ^ \markup{ 0.0 }  } \new Voice { \voiceTwo d,4  }>> \oneVoice r2. | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 |   | ||||
| \time 3/4 | ||||
| r2. |   \bar "||" \mark \markup { \bold \box 2.2 }  | ||||
| \time 4/4 | ||||
|  <<{ a,,4 ^ \markup{ 5.0 }  } \new Voice { \voiceTwo a,,4  }>> \oneVoice r2. | r2  <<{ a,,4 ^ \markup{ 4.4 }  } \new Voice { \voiceTwo a,,4  }>> \oneVoice r4 | R1 | r2  <<{ a,,4 ^ \markup{ 3.9 }  } \new Voice { \voiceTwo a,,4  }>> \oneVoice r4 | R1 | r2  <<{ a,,4 ^ \markup{ 3.3 }  } \new Voice { \voiceTwo a,,4  }>> \oneVoice r4 | R1 | r2.  <<{ a,,4 ^ \markup{ 2.8 }  } \new Voice { \voiceTwo a,,4  }>> \oneVoice | R1 | R1 | r4  <<{ a,,4 ^ \markup{ 2.2 }  } \new Voice { \voiceTwo a,,4  }>> \oneVoice r2 | R1 | r2.  <<{ a,,4 ^ \markup{ 1.7 }  } \new Voice { \voiceTwo a,,4  }>> \oneVoice | R1 | R1 | r2  <<{ a,,4 ^ \markup{ 1.1 }  } \new Voice { \voiceTwo a,,4  }>> \oneVoice r4 | R1 | R1 | r2.  <<{ a,,4 ^ \markup{ 0.6 }  } \new Voice { \voiceTwo a,,4  }>> \oneVoice | R1 | R1 | R1 |   \bar "||" \mark \markup { \bold \box 2.3 } <<{ d,4 ^ \markup{ 0.0 }  } \new Voice { \voiceTwo d,4  }>> \oneVoice r2. | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 |  <<{ f,,4 ^ \markup{ 0.0 }  } \new Voice { \voiceTwo f,,4  }>> \oneVoice r2. | R1 | R1 | r4  <<{ e,,4 ^ \markup{ 0.0 }  } \new Voice { \voiceTwo e,,4  }>> \oneVoice r2 | R1 | R1 | R1 | R1 |   \bar ".|" \mark \markup { \bold \box 2.4 } <<{ d,4 ^ \markup{ -36.7 }  } \new Voice { \voiceTwo d,4  }>> \oneVoice r2. | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1 | R1  ] \bar "|." }  | ||||
| @ -0,0 +1,152 @@ | ||||
| ( | ||||
| //~~FUNCTION THAT GENERATES THE GUI | ||||
| ~generateGUI = { | ||||
| 	var win, clockStringFunc, metronomeStringFunc, metronomeColorFunc, masterView, faderView, tabs; | ||||
| 	var tabButtonReset, transportButton, mixerButton, startPos = 0; | ||||
| 	var partAbbr = ["guitar", "accompHigh", "accomLow", "interlude"]; | ||||
| 	var trackNames = ["guitar", "high", "low", "interlude"]; | ||||
| 	var partVols, partMutes, partPans; | ||||
| 	var masterMute, masterVol; | ||||
| 
 | ||||
| 	partVols = [1, 1, 1, 1]; | ||||
| 	partMutes = [1, 1, 1, 1]; | ||||
| 	partPans = [0, 0, 0, 0]; | ||||
| 	masterMute = 1; | ||||
| 	masterVol = 1; | ||||
| 
 | ||||
| 	clockStringFunc = { | ||||
| 		arg div; | ||||
| 		var min, sec; | ||||
| 		sec = (div / 5).trunc; | ||||
| 		min = (sec / 60).asInteger.asString; | ||||
| 		if(min.size == 1, {min = "0" ++ min}, {}); | ||||
| 		sec =  (sec % 60).asInteger.asString; | ||||
| 		if(sec.size == 1, {sec = "0" ++ sec}, {}); | ||||
| 		min ++ ":" ++ sec | ||||
| 	}; | ||||
| 	// [-30, -105, -104].asAscii and [-30, -105, -113].asAscii are unicode inverse bullet and normal bullet, respectively | ||||
| 	metronomeStringFunc = { arg div; case {div % 20 < 2} | ||||
| 		{[-30, -105, -104].asAscii} {div % 4 < 2} {[-30, -105, -113].asAscii} {true} {" "} }; | ||||
| 	metronomeColorFunc = { arg div; case {div % 20 < 2} {Color.red} {div % 4 < 2} {Color.blue} {true} {Color.black} }; | ||||
| 
 | ||||
| 	~appStatusFunc = Task({ | ||||
| 		loop { | ||||
| 			{~appStatus.string = ~appStatusString ++ "*"}.defer; | ||||
| 			0.5.wait; {~appStatus.string = ~appStatusString ++ "* *"}.defer; | ||||
| 			0.5.wait; {~appStatus.string = ~appStatusString ++ "* * *"}.defer; | ||||
| 			0.5.wait; {~appStatus.string = ~appStatusString ++ "* * * *"}.defer; | ||||
| 			0.5.wait; {~appStatus.string = ~appStatusString ++ "* * * * *"}.defer; | ||||
| 			0.5.wait; | ||||
| 		} | ||||
| 	}); | ||||
| 
 | ||||
| 	win = Window("Counterfeiting in Colonial Connecticut", Rect(500, 500, 1100, 500), false).front; | ||||
| 	masterView = { | ||||
| 		var view, masterIndicators, master, generator, transport, ranSeed, startPosText, pauseButton, clock, metronome; | ||||
| 
 | ||||
| 		OSCFunc({ arg msg, time; { | ||||
| 				clock.string = clockStringFunc.value(msg[3]); | ||||
| 				metronome.stringColor = metronomeColorFunc.value(msg[3]); | ||||
| 				metronome.string = metronomeStringFunc.value(msg[3])}.defer; | ||||
| 		},'/tr', s.addr); | ||||
| 
 | ||||
| 		view = View(win); | ||||
| 		generator = HLayout( | ||||
| 			Button(view).states_([["generate"]]).action_({ | ||||
| 				~appStatusString = "generating data"; | ||||
| 				~appStatusFunc.start; | ||||
| 				~generateData.value(seed: ranSeed.string.asInteger); | ||||
| 			}), | ||||
| 			ranSeed = TextField(view).string_("20170121"), | ||||
| 			Button(view).states_([["reset seed"]]).action_({ ranSeed.string = "20170121"}), | ||||
| 			Button(view).states_([["random seed"]]).action_({ ranSeed.string = 50000000.rand.asString}), | ||||
| 			[~appStatus = StaticText(view).string_("status: ready"), stretch: 1], | ||||
| 			nil); | ||||
| 		transport = HLayout( | ||||
| 			Button(view).states_([["play", Color.black], ["stop", Color.black, Color.grey]]).action_( | ||||
| 				/* | ||||
| 				{| pState | | ||||
| 					pauseButton.value = 0; | ||||
| 					if(pState.value == 0, {~play.set(\playRate, 0, \startTrig, 0); | ||||
| 						clock.string = clockStringFunc.value((startPos * ~totalDur * 5).asInteger)}, | ||||
| 						{~play.set(\startPos, startPos, \playRate, 1, \startTrig, 1)})} | ||||
| 				*/ | ||||
| 				{| pState | | ||||
| 					pauseButton.value = 0; | ||||
| 					if(pState.value == 0, {~patterns[0].stop; | ||||
| 						clock.string = clockStringFunc.value((startPos * ~totalDur * 5).asInteger)}, | ||||
| 					{~patterns[0].play})} | ||||
| 			), | ||||
| 			pauseButton = Button(view).states_([["pause", Color.black], ["pause", Color.black, Color.grey]]).action_( | ||||
| 				{| pState | | ||||
| 					if(pState.value == 1, {~play.set(\playRate, 0)},{~play.set(\playRate, 1)})}), | ||||
| 			StaticText(view).string_("start time"), | ||||
| 			[Slider(view, Rect(0, 0, 30, 5)).action_( | ||||
| 				{|pos| | ||||
| 					var min, sec; | ||||
| 					startPosText.string = clockStringFunc.value((pos.value * ~totalDur * 5).asInteger); | ||||
| 					startPos = pos.value; | ||||
| 			}), stretch: 1], | ||||
| 			startPosText = StaticText(win).string_("00:00").font_(Font("Monaco", 15)), | ||||
| 			nil); | ||||
| 		view.layout_(HLayout( | ||||
| 			[VLayout(generator, nil, | ||||
| 				HLayout(clock = StaticText(win).string_("00:00").font_(Font("Monaco", 200)), | ||||
| 				StaticText(win).string_("|").font_(Font("Monaco", 200)), | ||||
| 				metronome = StaticText(win).string_([-30, -105, -104].asAscii).font_(Font("Monaco", 300)).stringColor_(Color.red)), | ||||
| 				nil, transport | ||||
| 	), alignment: \top])) }; | ||||
| 	faderView = { | ||||
| 		var view, masterIndicators, trackIndicators, master, tracks; | ||||
| 		view = View(win); | ||||
| 		masterIndicators = {LevelIndicator()} ! 2; | ||||
| 		trackIndicators = {LevelIndicator()} ! 4; | ||||
| 
 | ||||
| 		OSCFunc.new({arg msg; { | ||||
| 			{|i| masterIndicators[i].value = msg[3 + i].ampdb.linlin(-40, 0, 0, 1)} ! 2}.defer}, | ||||
| 		'/masterLevels', s.addr); | ||||
| 		OSCFunc.new({arg msg; { | ||||
| 			{|i| trackIndicators[i].value = msg[3 + i].ampdb.linlin(-40, 0, 0, 1)} ! 4}.defer}, | ||||
| 		'/trackLevels', s.addr); | ||||
| 
 | ||||
| 		master = HLayout( | ||||
| 			VLayout( | ||||
| 				[HLayout( | ||||
| 					Slider(view).value_(0.8).action_( | ||||
| 						{|v| masterVol = v.value * 1.25; ~play.set(\masterVol, masterVol)}), | ||||
| 					masterIndicators[0], | ||||
| 					masterIndicators[1]), stretch: 2], | ||||
| 				Button(view).states_([["mute", Color.black], ["mute", Color.black, Color.grey]]).action_( | ||||
| 					{|v| masterMute = (1 - v.value).abs; ~play.set(\masterMute, masterMute)}), | ||||
| 				StaticText(view).string_("             master             ").align_(\center) | ||||
| 				//StaticText(view).string_("("++groupNames[group]++")").align_(\center) | ||||
| 			), | ||||
| 			nil); | ||||
| 
 | ||||
| 		tracks = { |part| | ||||
| 			HLayout( | ||||
| 				VLayout( | ||||
| 					HLayout( | ||||
| 						Slider(view).value_(0.8).action_( | ||||
| 							{|v| partVols[part] = v.value * 1.25; ~play.set(partAbbr[part] ++ "Vol", partVols[part])}), | ||||
| 						trackIndicators[part]), | ||||
| 					Button(view).states_([["mute", Color.black], ["mute", Color.black, Color.grey]]).action_( | ||||
| 						{|v| partMutes[part] = (1 - v.value).abs; ~play.set(partAbbr[part] ++ "Mute", partMutes[part])}), | ||||
| 					StaticText(view).string_("pan").align_(\center), | ||||
| 					Knob(view).value_(0.5).action_( | ||||
| 						{|v| partPans[part] = v.value * 2 - 1; ~play.set(partAbbr[part] ++ "Pan", partPans[part])}), | ||||
| 					StaticText(view).string_(trackNames[part]).align_(\center) | ||||
| 				), | ||||
| 				nil) | ||||
| 		} ! 4; | ||||
| 		view.layout_(HLayout(master, nil, *tracks))}; | ||||
| 	tabButtonReset = {transportButton.value = 1; mixerButton.value = 1; }; | ||||
| 	win.layout = VLayout( | ||||
| 		HLayout( | ||||
| 			transportButton = Button().states_([["transport", Color.white, Color.grey], ["transport", Color.black]]).action_( | ||||
| 				{tabButtonReset.value; transportButton.value = 0; tabs.index = 0 }).value_(0), | ||||
| 			mixerButton = Button().states_([["mixer", Color.white, Color.grey], ["mixer", Color.black]]).action_( | ||||
| 				{tabButtonReset.value; mixerButton.value = 0; tabs.index = 1 }).value_(1)), | ||||
| 		tabs = StackLayout(masterView.value, faderView.value)); | ||||
| }; | ||||
| ) | ||||
| @ -0,0 +1,52 @@ | ||||
| ( | ||||
| // MAIN LAUNCH (loads necessary files and definitions) | ||||
| 
 | ||||
| var appEnvironment, cond; | ||||
| 
 | ||||
| s.boot; | ||||
| 
 | ||||
| appEnvironment = Environment.make; | ||||
| appEnvironment.push; | ||||
| 
 | ||||
| // load | ||||
| "cicc_musical_data_generator.scd".loadRelative; | ||||
| "cicc_sonifier.scd".loadRelative; | ||||
| "cicc_gui.scd".loadRelative; | ||||
| "cicc_transcriber.scd".loadRelative; | ||||
| 
 | ||||
| ~allMusicData = ~genMusicData.value(); | ||||
| //~player = EventPatternProxy.new; | ||||
| ~patterns = ~allMusicData[0]; | ||||
| ~scoreData = ~allMusicData[1]; | ||||
| ~sectionOffsets = ~allMusicData[2]; | ||||
| 
 | ||||
| ~play = Synth.new(\masterPlayerControl); | ||||
| 
 | ||||
| ~generateGUI.value; | ||||
| 
 | ||||
| 
 | ||||
| //counterfeitTranscribe.value(~scoreData); | ||||
| 
 | ||||
| // init | ||||
| /* | ||||
| ~dir = thisProcess.nowExecutingPath.dirname; | ||||
| ~loadedTransform = nil; | ||||
| ~transform = [2, 1, 0, 1, 0, 0, 0]; | ||||
| ~tileMap = ~mapAll.value(6 /*max depth*/, ~transform); | ||||
| ~layoutState = 0; | ||||
| ~tempo = 120; | ||||
| ~dur = 0.125 * (120/~tempo); | ||||
| ~continuousPlay = false; | ||||
| 
 | ||||
| // launch | ||||
| ~launchTileVisualizer.value; | ||||
| ~launchGui.value; | ||||
| */ | ||||
| 
 | ||||
| //appEnvironment.pop; | ||||
| ) | ||||
| ~fader = Synth(\crossFade, [\sel, 0, \busA, ~busA.index, \busB, ~busB.index]); | ||||
| ~patterns[0].play | ||||
| ~transcribe.value(~scoreData) | ||||
| 
 | ||||
| ~patterns[0].stop | ||||
| @ -0,0 +1,559 @@ | ||||
| ( | ||||
| var genInitSeq, finalizeSeqs, finalizeAccompHigh, finalizeAccompLow; | ||||
| 
 | ||||
| thisThread.randSeed = 1004; | ||||
| 
 | ||||
| //~~~~init vars for initial sequence generation | ||||
| genInitSeq = { | ||||
| 	var setDur, strings, stringIndex, state, lastStrings, position, dur, openStringCount, landingCount, sectionCount, res; | ||||
| 
 | ||||
| 	//~~~~helper dur function | ||||
| 	setDur = {[0, 2, 3, 4, 5.rand + 3].wchoose([0, 5, 5, 5, 1].normalizeSum)}; | ||||
| 
 | ||||
| 	strings = (0..5); | ||||
| 	//stringIndex = 0; | ||||
| 	state = 6.collect({[0, 1].wchoose([2, 1].normalizeSum)}); //fretted or not | ||||
| 	lastStrings = [nil, nil]; | ||||
| 	position = 6.collect({10 + 3.rand}); //which frets | ||||
| 	dur = setDur.value; | ||||
| 	openStringCount = 0; | ||||
| 	landingCount = 0; //for extending section landing on open strings | ||||
| 	sectionCount = 0; | ||||
| 
 | ||||
| 	res = []; //notes before the more static repetitions are put in | ||||
| 
 | ||||
| 	//~~~~run routine and create template sequence | ||||
| 	({sectionCount < 2}).while({ | ||||
| 		var alterPattern; | ||||
| 
 | ||||
| 		//alter string pattern or not | ||||
| 		alterPattern = [true, false].wchoose([1, 2].normalizeSum); | ||||
| 		if(alterPattern, { | ||||
| 			strings = (0..5).scramble[..(4.rand + 1)]; | ||||
| 			//rotate if a note gets repeated | ||||
| 			if(lastStrings.last == strings.first, {strings = strings.rotate}); | ||||
| 			//stringIndex = 0; | ||||
| 			lastStrings = strings; | ||||
| 		}); | ||||
| 
 | ||||
| 		//iterate through the strings | ||||
| 		strings.do({arg string, stringIndex; | ||||
| 			var alterPos; | ||||
| 
 | ||||
| 			//alter state or not favoring off if on (determines if string is open or fretted) | ||||
| 			if(sectionCount.even, { | ||||
| 				var isFretted, probs, alterState; | ||||
| 				isFretted = (state[string] == 1); | ||||
| 				probs = [if(isFretted, {2}, {1}), 1].normalizeSum; | ||||
| 				alterState = [true, false].wchoose(probs); | ||||
| 				if(alterState, {state[string] = (state[string] + 1) % 2}); | ||||
| 			}); | ||||
| 
 | ||||
| 			//alternate option | ||||
| 			if(sectionCount.odd, { | ||||
| 				var isFretted, alterable; | ||||
| 				isFretted = (state[string] == 1); | ||||
| 				alterable = isFretted || ((state[string] == 0) && (state.sum < 3)); | ||||
| 				if(alterable, { | ||||
| 					var probs, alterState; | ||||
| 					probs = [if(isFretted, {1}, {2}), 1].normalizeSum; | ||||
| 					alterState = [true, false].wchoose(probs); | ||||
| 					if(alterState, {state[string] = (state[string] + 1) % 2}); | ||||
| 				}); | ||||
| 			}); | ||||
| 
 | ||||
| 			//alter fret if fretted and keeping hand in similar position | ||||
| 			alterPos = (position[string] * state[string]) > 0; | ||||
| 			alterPos = alterPos && (state[string] == 1); //isFretted | ||||
| 			alterPos = alterPos && (position[string] > (position.maxItem - 3)); | ||||
| 			alterPos = [alterPos, false].wchoose([7, 1].normalizeSum); | ||||
| 			if(alterPos, { | ||||
| 				var walkDown, stepLimit; | ||||
| 				//walk down or not | ||||
| 				//BUG - GETTING REPEATED NOTES HERE!!!! | ||||
| 				walkDown = [true, false].wchoose([1, 2].normalizeSum); | ||||
| 				if(walkDown, { | ||||
| 					res = res.add([string, state[string] * position[string], dur, position.deepCopy]); | ||||
| 				}); | ||||
| 
 | ||||
| 				//make sure a hand position is not too wide | ||||
| 				stepLimit = (position.maxItem - (position[string] - 2)) != 4; | ||||
| 				if(stepLimit.not, { | ||||
| 					position[string] = (position[string] - 1).clip(0, 12); | ||||
| 				}); | ||||
| 				if(stepLimit, { | ||||
| 					position[string] = (position[string] - [1, 2].choose).clip(0, 12); | ||||
| 				}); | ||||
| 			}); | ||||
| 
 | ||||
| 			//alter duration or not | ||||
| 			if([true, false].wchoose([3, 1].normalizeSum), {dur = setDur.value}); | ||||
| 
 | ||||
| 			//add | ||||
| 			res = res.add([string, state[string] * position[string], dur, position.deepCopy]); | ||||
| 
 | ||||
| 			//reset if everything arrives at the bottom string | ||||
| 			//perhaps erase the extranotes here! | ||||
| 			if((position[string] * state[string]) == 0, {openStringCount = openStringCount + 1}, {openStringCount = 0}); | ||||
| 			if(position == [0, 0, 0, 0, 0, 0], { | ||||
| 				var hasLanded; | ||||
| 				hasLanded = (openStringCount > 20) && (stringIndex == (strings.size - 1)); | ||||
| 				if(hasLanded, { | ||||
| 					position = 6.collect({10 + 3.rand}); | ||||
| 					landingCount = 0; | ||||
| 					sectionCount = sectionCount + 1; | ||||
| 					(openStringCount - 1).do({arg index; | ||||
| 						res[res.size - index - 1][3] = [0, 0, 0, 0, 0, 0]; | ||||
| 						res[res.size - index - 1][2] = (dur * (1 + ((1 - (index / openStringCount).clip(0, 1).postln.pow(0.25)) * 10))).asInteger | ||||
| 					}); | ||||
| 				}); | ||||
| 				if(hasLanded.not, {landingCount = landingCount + 1}) | ||||
| 			}); | ||||
| 		}) | ||||
| 	}); | ||||
| 	res | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| //~~~~insert more static sections by repeating a figure | ||||
| finalizeSeqs = {arg initSeq; | ||||
| 	var extendToBeat, insertTS, | ||||
| 	timeStampSection, timeStampTotal, timeStampSectionStart, lastDur, lastPos, | ||||
| 	sectionSeq, timeSigInsSeq, sectionLen, sectionPosLimit, state, guitarSeq; | ||||
| 
 | ||||
| 	extendToBeat = {arg seq; | ||||
| 		var timeStampTotal, altEndDur; | ||||
| 		// this makes sure it is some multiple of a beat | ||||
| 		timeStampTotal = seq.slice(nil, 2).sum; | ||||
| 		altEndDur = timeStampTotal.round(4) - timeStampTotal; | ||||
| 		if(altEndDur < 0, {altEndDur = altEndDur + 4}); | ||||
| 		seq.last[2] = seq.last[2] + altEndDur; | ||||
| 		[seq, altEndDur]; | ||||
| 	}; | ||||
| 
 | ||||
| 	insertTS = {arg seq, timeStampSectionStart, type, accompSwitch; | ||||
| 		var timeStampTotal, noMeasures; | ||||
| 		timeStampTotal = seq.slice(nil, 2).sum; | ||||
| 		sectionSeq = sectionSeq.add([timeStampTotal, type, accompSwitch]); | ||||
| 		noMeasures = ((timeStampTotal - timeStampSectionStart) / 16); | ||||
| 		if(noMeasures.frac > 0, { | ||||
| 			timeSigInsSeq = timeSigInsSeq.add( | ||||
| 				// make 5/4 instrad of 1/4 | ||||
| 				if((noMeasures.frac / 0.25).asInteger != 1, { | ||||
| 					[timeStampTotal - (4 * (noMeasures.frac / 0.25).asInteger),(noMeasures.frac / 0.25).asInteger] | ||||
| 				}, { | ||||
| 					[timeStampTotal - (4 * 5), 5] | ||||
| 				}); | ||||
| 			); | ||||
| 			timeSigInsSeq = timeSigInsSeq.add([timeStampTotal, 4]); | ||||
| 		}); | ||||
| 	}; | ||||
| 
 | ||||
| 	timeStampSection = 0; //track time in each section | ||||
| 	timeStampTotal = 0; //track overall time | ||||
| 	timeStampSectionStart = 0; //track the time of the start of a section | ||||
| 	lastDur = initSeq[0][2]; //helper for time signature data | ||||
| 	lastPos = initSeq[0].last; //helper for keeping track of landing. | ||||
| 
 | ||||
| 	guitarSeq = []; //this is the final sequence with repetitions inserted | ||||
| 	sectionSeq = [[0, 0, true]]; //sequence of times for each section (used for double bars in score) | ||||
| 	timeSigInsSeq = [[0, 4]]; //sequence for insertion of time signatures and double bars; | ||||
| 
 | ||||
| 	//sectionLen = 128; | ||||
| 	sectionPosLimit = 3 + 6.rand; | ||||
| 	state = 0; | ||||
| 
 | ||||
| 	initSeq.do({arg item, index, altEndDur; | ||||
| 		var dur, pos; | ||||
| 		dur = item[2]; | ||||
| 		pos = item.last; | ||||
| 
 | ||||
| 		if(state != 1, { | ||||
| 			// basically this just copies the original template over | ||||
| 			var landingBorder, sectionBorder; | ||||
| 			landingBorder = (pos == [0, 0, 0, 0, 0, 0]) && (lastPos != [0, 0, 0, 0, 0, 0]); | ||||
| 			sectionBorder = (pos != [0, 0, 0, 0, 0, 0]) && (lastPos == [0, 0, 0, 0, 0, 0]); | ||||
| 			if(landingBorder || sectionBorder, { | ||||
| 				var seqExtPair; | ||||
| 				seqExtPair = extendToBeat.value(guitarSeq); | ||||
| 				guitarSeq = seqExtPair[0]; | ||||
| 				timeStampSection = timeStampSection + seqExtPair[1]; | ||||
| 				insertTS.value(guitarSeq, timeStampSectionStart, if(pos == [0, 0, 0, 0, 0, 0], {1}, {-1}), false); | ||||
| 				timeStampSectionStart = guitarSeq.slice(nil, 2).sum; | ||||
| 				//if(((sectionLen - timeStampSection) < (16 * 8)) && (pos != [0, 0, 0, 0, 0, 0]), {sectionLen = sectionLen + (16 * 8)}); | ||||
| 			}); | ||||
| 
 | ||||
| 			if(sectionBorder, { | ||||
| 				state = 0; | ||||
| 				sectionPosLimit = 3 + 6.rand; | ||||
| 			}); | ||||
| 
 | ||||
| 			guitarSeq = guitarSeq.add(item.add(-1)); | ||||
| 			timeStampSection = timeStampSection + dur; | ||||
| 
 | ||||
| 			lastDur = dur; | ||||
| 			lastPos = pos; | ||||
| 
 | ||||
| 			if((state == 0) && (pos.minItem < sectionPosLimit), {state = 1}); | ||||
| 		}); | ||||
| 
 | ||||
| 		if(state == 1, { | ||||
| 			// grabs a figure and repeats it altering it subtly | ||||
| 			var rec, reps, noMeasures; | ||||
| 
 | ||||
| 			// this makes sure it the length of the section | ||||
| 			//timeStampTotal = guitarSeq.slice(nil, 2).sum; | ||||
| 			//altEndDur = sectionLen - timeStampSection; | ||||
| 			//guitarSeq.last[2] = guitarSeq.last[2] + altEndDur; | ||||
| 
 | ||||
| 			guitarSeq = extendToBeat.value(guitarSeq)[0]; | ||||
| 			timeStampTotal = guitarSeq.slice(nil, 2).sum; | ||||
| 			insertTS.value(guitarSeq, timeStampSectionStart, 0, true); | ||||
| 			timeStampSectionStart = timeStampTotal; | ||||
| 			//sectionSeq = sectionSeq.add([timeStampTotal, 0, true]); | ||||
| 			rec = guitarSeq[(guitarSeq.size - (10.rand + 5))..guitarSeq.size].deepCopy; | ||||
| 			reps = 5.rand + 5; | ||||
| 			reps.do({arg index; | ||||
| 				rec.do({arg item, rIndex; | ||||
| 					var add, dur; | ||||
| 					add = if(index == 0, {3}, {0}); | ||||
| 					dur = (item[2] + 2.rand2 + add); | ||||
| 					if(dur < 2, {dur = [0, 2].wchoose([1, 4].normalizeSum)}); | ||||
| 					rec[rIndex] = [item[0], item[1], dur]; | ||||
| 					if([true, false].wchoose([5, 1].normalizeSum), { | ||||
| 						guitarSeq = guitarSeq.add(rec[rIndex].add((1 / reps) * index)); | ||||
| 						//timeStampTotal = timeStampTotal + dur; | ||||
| 					}); | ||||
| 
 | ||||
| 					// if chord randomly choose one of the notes | ||||
| 					if(guitarSeq.last[2] == 0, { | ||||
| 						arg toAdd = []; | ||||
| 						//guitarSeq[(guitarSeq.size - 3)..].postln; | ||||
| 						toAdd = toAdd.add(guitarSeq.pop); | ||||
| 						toAdd = toAdd.add(guitarSeq.pop); | ||||
| 						toAdd[0][2] = toAdd[1][2]; | ||||
| 						toAdd[1][3] = toAdd[0][3]; | ||||
| 						//toAdd.postln; | ||||
| 						toAdd = toAdd.choose; | ||||
| 						guitarSeq = guitarSeq.add(toAdd); | ||||
| 						//guitarSeq[(guitarSeq.size - 2)..].postln | ||||
| 					}); | ||||
| 				}); | ||||
| 
 | ||||
| 				guitarSeq = extendToBeat.value(guitarSeq)[0]; | ||||
| 
 | ||||
| 			}); | ||||
| 
 | ||||
| 			insertTS.value(guitarSeq, timeStampSectionStart, 0, true); | ||||
| 
 | ||||
| 			timeStampSection = 0; | ||||
| 			timeStampSectionStart = guitarSeq.slice(nil, 2).sum; | ||||
| 			sectionLen = ((20 + 60.rand) / 0.08).asInteger.round(16); | ||||
| 			lastDur = initSeq[index + 1][2]; | ||||
| 			state = 2; | ||||
| 		}); | ||||
| 	}); | ||||
| 	[guitarSeq, sectionSeq, timeSigInsSeq] | ||||
| }; | ||||
| 
 | ||||
| // add the high note part | ||||
| finalizeAccompHigh = {arg sectionSeq; | ||||
| 	var accompHighSeq, timeStamp, secType; | ||||
| 	accompHighSeq = []; | ||||
| 	timeStamp = 0; | ||||
| 	secType = 0; | ||||
| 	//sectionSeq.postln; | ||||
| 	//(sectionSeq.select({arg item; item.last == true}).slice(nil, 0) * 0.08).do({arg secEnd, secIndex; | ||||
| 
 | ||||
| 	sectionSeq.do({arg secData; | ||||
| 		var secEnd, freq, noRestCount, shortCount; | ||||
| 		secEnd = secData[0] * 0.08; | ||||
| 		freq = if(secType == 0, {62.midicps * 8},  {62.midicps * 8 * 6/5}); | ||||
| 		if(secData.last, {secType = ((secType + 1) % 2)}); | ||||
| 		noRestCount = 0; | ||||
| 		shortCount = 0; | ||||
| 		while({timeStamp < secEnd}, { | ||||
| 			var dur, sus, isShort, insertRest; | ||||
| 
 | ||||
| 			isShort = case | ||||
| 			{shortCount == 0} {true} | ||||
| 			{shortCount < 3} {[true, false].wchoose([2, 1].normalizeSum)} | ||||
| 			{true} {false}; | ||||
| 
 | ||||
| 			insertRest = [true, noRestCount > 3].wchoose([1, 1].normalizeSum); | ||||
| 
 | ||||
| 			if(isShort, { | ||||
| 				sus = (1.5.rand + 1.5).round(0.16); | ||||
| 				shortCount = shortCount + 1; | ||||
| 			}, { | ||||
| 				sus = (5.rand + 4).round(0.16); | ||||
| 				shortCount = 0; | ||||
| 			}); | ||||
| 
 | ||||
| 			if(insertRest, { | ||||
| 				dur = sus + (1.5.rand + 1.5).round(0.16); | ||||
| 				noRestCount = 0; | ||||
| 			}, { | ||||
| 				dur = sus + 0.5.round(0.16); | ||||
| 				noRestCount = noRestCount + 1; | ||||
| 			}); | ||||
| 
 | ||||
| 			if((timeStamp + dur) < secEnd, { | ||||
| 				accompHighSeq = accompHighSeq.add([freq, dur, sus.clip(0, dur)]); | ||||
| 			}, { | ||||
| 				dur = ((secEnd - timeStamp) + 3.rand).clip(0.16, 1000).round(0.16); | ||||
| 				accompHighSeq = accompHighSeq.add([freq, dur, 0]); | ||||
| 			}); | ||||
| 			timeStamp = timeStamp + dur; | ||||
| 		}); | ||||
| 	}); | ||||
| 	accompHighSeq | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // add the low note part | ||||
| finalizeAccompLow = {arg guitarSeq, sectionSeq; | ||||
| 	var accompLowSeq, durAccum, lastTrigVal; | ||||
| 	accompLowSeq = []; | ||||
| 	durAccum = 0; | ||||
| 	lastTrigVal = 0; | ||||
| 	guitarSeq.do({arg item, i; | ||||
| 		var dur, trig, freq1, freq2, finalDur; | ||||
| 		dur = item[2]; | ||||
| 		trig = item.last; | ||||
| 		if(lastTrigVal != trig, { | ||||
| 			freq1 = if(trig > -1, {62.midicps / 4 * 3/4}, {62.midicps / 4}); | ||||
| 			freq2 = freq1 + if(trig > -1, {5 * (1-trig)}, {0}); | ||||
| 			finalDur = durAccum; | ||||
| 			accompLowSeq = accompLowSeq.add([freq1, freq2, finalDur]); | ||||
| 			durAccum = 0; | ||||
| 		}); | ||||
| 		durAccum = durAccum + dur; | ||||
| 		lastTrigVal = trig; | ||||
| 	}); | ||||
| 
 | ||||
| 	accompLowSeq = [accompLowSeq.slice(nil, 0), accompLowSeq.slice(nil, 1), accompLowSeq.slice(nil, 2).integrate].flop; | ||||
| 	sectionSeq.collect({arg section; | ||||
| 		if(section[1] == 1, { | ||||
| 			var curTime = section[0]; | ||||
| 			accompLowSeq = accompLowSeq.add([62.midicps / 4, 62.midicps / 8, curTime]); | ||||
| 			curTime = curTime - ((4.rand + 4) / 0.08).round(4).asInteger; | ||||
| 			accompLowSeq = accompLowSeq.add([64.midicps / 8, 64.midicps / 8, curTime]); | ||||
| 			curTime = curTime - ((4.rand + 4) / 0.08).round(4).asInteger; | ||||
| 			accompLowSeq = accompLowSeq.add([65.midicps / 8, 65.midicps / 8, curTime]); | ||||
| 		}); | ||||
| 		if(section[1] == -1, { | ||||
| 			var curTime = section[0]; | ||||
| 			accompLowSeq = accompLowSeq.add([62.midicps / 4, 62.midicps / 4, curTime]); | ||||
| 			//curTime = curTime - ((4.rand + 4) / 0.08).round(4).asInteger; | ||||
| 			//accompLowSeq = accompLowSeq.add([69.midicps / 8, 69.midicps / 8, curTime]); | ||||
| 		}); | ||||
| 	}); | ||||
| 
 | ||||
| 	accompLowSeq = accompLowSeq.sort({ arg a, b; a[2] < b[2] }); | ||||
| 	accompLowSeq = [accompLowSeq.slice(nil, 0), accompLowSeq.slice(nil, 1), | ||||
| 		accompLowSeq.slice(nil, 2).differentiate.drop(1).add(1)].flop; | ||||
| 
 | ||||
| 	//accompLowSeq = [accompLowSeq.slice(nil, 0), accompLowSeq.slice(nil, 1),accompLowSeq.slice(nil, 2).drop(1).add(1)].flop; | ||||
| 
 | ||||
| 	accompLowSeq | ||||
| }; | ||||
| 
 | ||||
| ~genMusicData = { | ||||
| 	var initSeq, finalSeqs, guitarSeq, accompHighSeq, accompLowSeq, sectionSeq, timeSigSeq, | ||||
| 	patterns, scoreData, sectionOffsets; | ||||
| 
 | ||||
| 	initSeq = genInitSeq.value; | ||||
| 	finalSeqs = finalizeSeqs.value(initSeq); | ||||
| 	guitarSeq = finalSeqs[0]; | ||||
| 	accompHighSeq = finalizeAccompHigh.value(finalSeqs[1]); | ||||
| 	accompLowSeq = finalizeAccompLow.value(finalSeqs[0], finalSeqs[1]); | ||||
| 	sectionSeq = finalSeqs[1]; | ||||
| 	timeSigSeq = finalSeqs[2]; | ||||
| 
 | ||||
| 	patterns = ~genPatterns.value(guitarSeq, accompLowSeq, accompHighSeq, sectionSeq); | ||||
| 	scoreData =  ~genScoreData.value(guitarSeq, accompLowSeq, accompHighSeq, timeSigSeq, sectionSeq); | ||||
| 	sectionOffsets = sectionSeq.slice(nil, 0); | ||||
| 
 | ||||
| 	[patterns, scoreData, sectionOffsets] | ||||
| }; | ||||
| ) | ||||
| 
 | ||||
| 
 | ||||
| /* | ||||
| ~player[0].play; | ||||
| 
 | ||||
| ( | ||||
| ~player = EventPatternProxy.new; | ||||
| ~faderPattern = Pmono( | ||||
| 			\crossFade, | ||||
| 			\sel, Pseq([0, 1], ~sectionOffsets / 2), | ||||
| 			\dur, Pseq(~sectionOffsets.differentiate.drop(1) * 0.08), | ||||
| 			\busA, ~busA.index, | ||||
| 			\busB, ~busB.index | ||||
| 	); | ||||
| ~fader = Synth(\crossFade, [\sel, 0, \busA, ~busA.index, \busB, ~busB.index]); | ||||
| ~player.source = Ptpar( | ||||
| 	([~sectionOffsets.postln * 0.08, ~patterns].flop.flat ++ [0, ~faderPattern]).postln | ||||
| ); | ||||
| ) | ||||
| ~fader.play | ||||
| ~player.play | ||||
| ( | ||||
| ~fader.set(\sel, 1); | ||||
| ~patterns[3].play | ||||
| ) | ||||
| 
 | ||||
| ~fader = Synth(\crossFade, [\sel, 1, \busA, ~busA.index, \busB, ~busB.index]); | ||||
| ( | ||||
| ~patterns[3].play; | ||||
| ~testDrone = Synth.new(\droneOut, [\gate, 1, \bus, ~droneBus.index]); | ||||
| //~testDrone.set(\gate, 0); | ||||
| ~dronePattern.play | ||||
| ) | ||||
| 
 | ||||
| 
 | ||||
| ( | ||||
| ~player.source = Ptpar([~sectionOffsets.postln * 0.08, | ||||
| 	~patterns.collect({arg pt, i; | ||||
| 		if(i < (~patterns.size - 1), { | ||||
| 			PfadeOut(pt, 0.1, (~sectionOffsets.differentiate.drop(1)[i] * 0.08) - 0.1) | ||||
| 		}, { | ||||
| 			pt | ||||
| 		}) | ||||
| })].flop.flat.postln); | ||||
| ) | ||||
| ~sectionOffsets.differentiate.postln; | ||||
| ~player.play | ||||
| PfadeOut(~patterns[2], 0.1, (~sectionOffsets.differentiate.drop(1)[2] * 0.08) - 0.1).play | ||||
| PfadeOut(~player[0]).play; | ||||
| Pdef(\play, ~player[0]).play; | ||||
| Pdef(\play, ~player[1]) | ||||
| ~player[2].play; | ||||
| ~player.pause; | ||||
| 
 | ||||
| 
 | ||||
| ( | ||||
| var durUnit = 0.15; | ||||
| 
 | ||||
| SynthDef(\machine, {arg freq, gate = 1, sustain, amp; | ||||
| 	var sound; | ||||
| 	sound = TWChoose.ar(Impulse.kr(0), [ | ||||
| 		PinkNoise.ar(EnvGen.kr(Env.perc(0.01, sustain, amp * 10), gate, doneAction: 2)), | ||||
| 		BrownNoise.ar(EnvGen.kr(Env.perc(0.01, sustain, amp * 2), gate, doneAction: 2)) | ||||
| 	], [0, 20], 1); | ||||
| 	Out.ar([0, 1], sound) | ||||
| }).add; | ||||
| 
 | ||||
| ~machine1 = Pbind( | ||||
| 	\instrument, \machine, | ||||
| 	\amp, Pseq(300.collect({var rand = [0.03, 0].choose; (20.rand + 10).rand.collect({rand})}).flat), | ||||
| 	\dur, Pseq(1000.collect({[durUnit, durUnit + (durUnit / 100).rand2].wchoose([10, 1].normalizeSum)}).flat), | ||||
| 	\sustain, Pseq(1000.collect({durUnit * (1.75 + 0.5.rand)})),//2.25].wchoose([1, 20].normalizeSum)})), | ||||
| 	\freq, Pseq(1000.collect({[[300, 250], [300, 250].choose].wchoose([10, 1].normalizeSum)}).flat / 2) | ||||
| ).play; | ||||
| ) | ||||
| 
 | ||||
| ~machine1.play; | ||||
| ~machine1.stop; | ||||
| 
 | ||||
| 
 | ||||
| ( | ||||
| var durUnit = 0.02; | ||||
| b = Bus.audio(s, 1); | ||||
| 
 | ||||
| SynthDef(\test, { arg out=0, freq=440, amp=0.1, pan=0, gate=1; | ||||
| 	var z; | ||||
| 	z = LPF.ar( | ||||
| 		Mix.new(VarSaw.ar(freq + [0, Rand(-0.4,0.0), Rand(0.0,0.4)], 0, 0.3, 0.3)), | ||||
| 		XLine.kr(Rand(4000,5000), Rand(2500,3200), 1) | ||||
| 	) * Linen.kr(gate, 0.01, 0.7, 0.3, 2); | ||||
| 	Out.ar(b, Pan2.ar(z, pan, amp)); | ||||
| }, [\ir]).add; | ||||
| 
 | ||||
| SynthDef(\defaultBus, {arg gate; | ||||
| 	Out.ar([0, 1], Clip.ar(In.ar(b, 1), -1, 1) * 0.25 * EnvGen.ar(Env.asr(20, 1, 20), gate)) | ||||
| } | ||||
| ).add; | ||||
| 
 | ||||
| Pbind( | ||||
| 	\instrument, \test, | ||||
| 	\amp, 0.5, | ||||
| 	\dur, durUnit, | ||||
| 	\sustain, 0.05, | ||||
| 	\freq, Pseq(3000.collect({[[62.midicps, 250], [62.midicps, 250].choose].wchoose([10, 1].normalizeSum)}).flat / 2) | ||||
| ).play; | ||||
| 
 | ||||
| ~testDrone = Synth.new(\defaultBus, [\gate, 1]); | ||||
| ) | ||||
| 
 | ||||
| ~testDrone.set(\gate, 0); | ||||
| 
 | ||||
| 
 | ||||
| ( | ||||
| var durUnit = 0.02; | ||||
| b = Bus.audio(s, 1); | ||||
| 
 | ||||
| SynthDef(\test, { arg out=0, freq=440, amp=0.1, pan=0, gate=1; | ||||
| 	var z; | ||||
| 	z = LPF.ar( | ||||
| 		Mix.new(VarSaw.ar(freq + [0, Rand(-0.4,0.0), Rand(0.0,0.4)], 0, 0.3, 0.3)), | ||||
| 		XLine.kr(Rand(4000,5000), Rand(2500,3200), 1) | ||||
| 	) * Linen.kr(gate, 0.01, 0.7, 0.3, 2); | ||||
| 	Out.ar(b, Pan2.ar(z, pan, amp)); | ||||
| }, [\ir]).add; | ||||
| 
 | ||||
| SynthDef(\defaultBus, { | ||||
| 	Out.ar([0, 1], Clip.ar(In.ar(b, 1), -1, 1) * 0.25) | ||||
| } | ||||
| ).add; | ||||
| 
 | ||||
| Pbind( | ||||
| 	\instrument, \test, | ||||
| 	\amp, Pseq(3000.collect({arg i; (i / 3000).clip(0, 1) * 0.5})), | ||||
| 	\dur, durUnit, | ||||
| 	\sustain, 0.05, | ||||
| 	\freq, Pseq(3000.collect({[[62.midicps, 250], [62.midicps, 250].choose].wchoose([10, 1].normalizeSum)}).flat / 2) | ||||
| ).play; | ||||
| 
 | ||||
| Synth.new(\defaultBus) | ||||
| ) | ||||
| 
 | ||||
| 
 | ||||
| ( | ||||
| var durUnit = 0.15; | ||||
| 
 | ||||
| SynthDef(\machine, {arg freq, gate = 1, sustain, amp; | ||||
| 	var sound; | ||||
| 	sound = TWChoose.ar(Impulse.kr(0), [ | ||||
| 		PinkNoise.ar(EnvGen.kr(Env.perc(0.01, sustain, amp * 10), gate, doneAction: 2)), | ||||
| 		BrownNoise.ar(EnvGen.kr(Env.perc(0.01, sustain, amp * 2), gate, doneAction: 2)) | ||||
| 	], [0, 20], 1); | ||||
| 	Out.ar([0, 1], sound) | ||||
| }).add; | ||||
| 
 | ||||
| ~machine1 = Pseq( | ||||
| 	10.collect({ | ||||
| 		var randL, randLArray, amp, durUnitSMult, durUnitSMultLimit, hitsToClip; | ||||
| 		randL = 30.rand + 30; | ||||
| 		randLArray = (0..randL) ++  (0..(randL-1)).reverse; | ||||
| 		amp = [0.1, 0].wchoose([2, 1].normalizeSum); | ||||
| 		durUnitSMult = 2 + 1.0.rand; | ||||
| 		durUnitSMultLimit = (durUnitSMult - 1) + 0.5.rand; | ||||
| 		hitsToClip = 3 + 3.rand; | ||||
| 
 | ||||
| 		Pseq([Pbind( | ||||
| 			\instrument, \machine, | ||||
| 			\amp, 0.1, | ||||
| 			\dur, Pseq(randLArray.collect({arg i; durUnit * (durUnitSMult - ((i / hitsToClip).clip(0, durUnitSMultLimit)))})), | ||||
| 			\sustain, Pseq(randLArray.size.collect({durUnit * (1.75 + 0.5.rand)})),//2.25].wchoose([1, 20].normalizeSum)})), | ||||
| 			\freq, Pseq(randLArray.size.collect({[[300, 250], [300, 250].choose].wchoose([10, 1].normalizeSum)}).flat / 2) | ||||
| 		),Rest(3.rand + 5) | ||||
| 		]) | ||||
| 	}), inf | ||||
| ).play; | ||||
| ) | ||||
| 
 | ||||
| 62.midicps | ||||
| 
 | ||||
| */ | ||||
| @ -0,0 +1,213 @@ | ||||
| ( | ||||
| //busses | ||||
| ~masterBus = Bus.audio(s, 1); | ||||
| ~guitarBusA = Bus.audio(s, 1); | ||||
| ~guitarBusB = Bus.audio(s, 1); | ||||
| ~accompHighBusA = Bus.audio(s, 1); | ||||
| ~accompHighBusB = Bus.audio(s, 1); | ||||
| ~accompLowBusA = Bus.audio(s, 1); | ||||
| ~accompLowBusB = Bus.audio(s, 1); | ||||
| 
 | ||||
| 
 | ||||
| SynthDef(\masterPlayerControl, { | ||||
| 	arg sel = 0, | ||||
| 	masterVol = 1, masterMute = 1, | ||||
| 	guitarVol = 1, guitarPan = 0, guitarMute = 1, | ||||
| 	accompHighVol = 1, accompHighPan = 0, accompHighMute = 1, | ||||
| 	accompLowVol = 1, accompLowPan = 0, accompLowMute = 1; | ||||
| 	var guitarSig, accompHighSig, accompLowSig, | ||||
| 	guitarSigPanned, accompHighSigPanned, accompLowSigPanned, | ||||
| 	masterSig, imp; | ||||
| 
 | ||||
| 	guitarSig = SelectX.ar(sel, [In.ar(~guitarBusA), In.ar(~guitarBusB)]) * guitarVol; | ||||
| 	accompHighSig = SelectX.ar(sel, [In.ar(~accompHighBusA), In.ar(~accompHighBusB)]) * accompHighVol; | ||||
| 	accompLowSig = SelectX.ar(sel, [In.ar(~accompLowBusA), In.ar(~accompLowBusB)]) * accompLowVol; | ||||
| 
 | ||||
| 	guitarSigPanned = Pan2.ar(guitarSig * guitarMute, guitarPan); | ||||
| 	accompHighSigPanned = Pan2.ar(accompHighSig * accompHighMute, accompHighPan); | ||||
| 	accompLowSigPanned = Pan2.ar(accompLowSig * accompLowMute, accompLowPan); | ||||
| 	masterSig = Mix.ar([guitarSigPanned, accompHighSigPanned, accompLowSigPanned]) * masterVol * masterMute; | ||||
| 
 | ||||
| 	Out.ar(0, masterSig); | ||||
| 
 | ||||
| 	imp = Impulse.kr(10); | ||||
| 	SendReply.kr(imp, | ||||
| 		'/masterLevels', | ||||
| 		values: [Amplitude.kr(masterSig)]); | ||||
| 	SendReply.kr(imp, | ||||
| 		'/trackLevels', | ||||
| 		values: [Amplitude.kr(guitarSig), Amplitude.kr(accompHighSig), Amplitude.kr(accompLowSig), DC.ar(0)]); | ||||
| }).add; | ||||
| 
 | ||||
| 
 | ||||
| //~~~~karplus | ||||
| SynthDef(\karplus, {arg freq, gate = 1, amp = 0.5, bus; | ||||
| 	Out.ar(bus, | ||||
| 		Pluck.ar(WhiteNoise.ar(0.1), Impulse.kr(0), 220.reciprocal, freq.reciprocal, 10, coef:0) * | ||||
| 		Linen.kr(gate, doneAction: Done.freeSelf) * amp | ||||
| 	) | ||||
| }).add; | ||||
| 
 | ||||
| 
 | ||||
| //~~~~accompaniment | ||||
| SynthDef(\accompBass, {arg freq1 = 100, freq2 = 100, gate = 1, amp = 0.5, bus; | ||||
| 	var bassDrop; | ||||
| 	bassDrop = Mix.ar([SinOsc.ar(freq1, 0, 0.5), SinOsc.ar(freq2, 0, 0.5)]) * | ||||
| 	EnvGen.kr(Env.perc(0.1, 10, level: amp), Impulse.kr(0) + Changed.kr(freq2)); | ||||
| 	Out.ar(bus, bassDrop) | ||||
| }).add; | ||||
| 
 | ||||
| 
 | ||||
| SynthDef(\accompTreble, {arg freq, gate = 1, sustain, amp, bus; | ||||
| 	var treble; | ||||
| 	treble = SinOsc.ar( | ||||
| 		freq, 0, | ||||
| 		EnvGen.kr(Env.sine(sustain, amp * 0.1), gate)); | ||||
| 	Out.ar(bus, treble) | ||||
| }).add; | ||||
| 
 | ||||
| 
 | ||||
| ~droneBus = Bus.audio(s, 1); | ||||
| SynthDef(\drone, { arg out=0, freq=440, amp=0.1, pan=0, gate=1, bus; | ||||
| 	var z; | ||||
| 	z = LPF.ar( | ||||
| 		Mix.new(VarSaw.ar(freq + [0, Rand(-0.4,0.0), Rand(0.0,0.4)], 0, 0.3, 0.3)), | ||||
| 		XLine.kr(Rand(4000,5000), Rand(2500,3200), 1) | ||||
| 	) * Linen.kr(gate, 0.01, 0.7, 0.3, 2); | ||||
| 	Out.ar(bus, Pan2.ar(z, pan, amp)); | ||||
| }, [\ir]).add; | ||||
| 
 | ||||
| 
 | ||||
| SynthDef(\droneOut, {arg gate, bus; | ||||
| 	Out.ar([0, 1], Clip.ar(In.ar(bus, 1), -1, 1) * 0.1 * EnvGen.ar(Env.asr(20, 1, 20), gate)) | ||||
| } | ||||
| ).add; | ||||
| 
 | ||||
| 
 | ||||
| ~dronePattern = Pbind( | ||||
| 	\instrument, \drone, | ||||
| 	\amp, 0.5, | ||||
| 	\dur, 0.02, | ||||
| 	\sustain, 0.05, | ||||
| 	\freq, Pseq(3000.collect({[[62.midicps, 250], [62.midicps, 250].choose].wchoose([10, 1].normalizeSum)}).flat / 2), | ||||
| 	\bus, ~droneBus.index | ||||
| ); | ||||
| 
 | ||||
| //~~~~gen music | ||||
| ~genPatterns = {arg guitarSeqIn, accompLowSeqIn, accompHighSeqIn, sectionSeqIn; | ||||
| 	var calcSustains, genSectionSec, sectionLimits; | ||||
| 
 | ||||
| 	//~~~~helper sus function | ||||
| 	calcSustains = {arg stringSeq, durSeq; | ||||
| 		var res = []; | ||||
| 		stringSeq.size.do({arg index; | ||||
| 			var curString, dur, count; | ||||
| 			if(stringSeq[index].isRest.not, { | ||||
| 				curString = stringSeq[index]; | ||||
| 				dur = durSeq[index]; | ||||
| 				count = 1; | ||||
| 				while({(stringSeq[(index + count).clip(0, stringSeq.size - 1)] != curString) && | ||||
| 					(dur < 16) && (count < 100)}, { | ||||
| 					dur = dur + durSeq[(index + count).clip(0, durSeq.size - 1)]; | ||||
| 					count = count + 1; | ||||
| 				}); | ||||
| 				res = res.add(dur.clip(0, 16)); | ||||
| 			}, { | ||||
| 				res.add(Rest()); | ||||
| 			}); | ||||
| 		}); | ||||
| 		res | ||||
| 	}; | ||||
| 
 | ||||
| 	genSectionSec = {arg seq, startTime, endTime, type; | ||||
| 		var durSum, resSeqs, inSecs, mult; | ||||
| 		//sectionSeq.postln; | ||||
| 		durSum = 0; | ||||
| 		resSeqs = []; | ||||
| 		inSecs = switch(type, 0, {false}, 1, {false}, 2, {true}); | ||||
| 		mult = if(inSecs, {1}, {0.08}); | ||||
| 		seq.do({arg item; | ||||
| 			if(((durSum * mult) >= (startTime * 0.08)) && ((durSum * mult) < (endTime * 0.08)), { | ||||
| 				var dur = (durSum * mult) - (startTime * 0.08); | ||||
| 				if((resSeqs.size == 0) && (dur > 0), { | ||||
| 					switch(type, | ||||
| 						0, {resSeqs = resSeqs.add([Rest(-1), Rest(-1), dur])}, | ||||
| 						1, {resSeqs = resSeqs.add([Rest(-1), Rest(-1), dur])}, | ||||
| 						2, {resSeqs = resSeqs.add([Rest(-1), dur.round(0.08), dur.round(0.08)])}) | ||||
| 				}); | ||||
| 				resSeqs = resSeqs.add(item); | ||||
| 			}); | ||||
| 			durSum = durSum + if(type == 2, {item[1]}, {item[2]}); | ||||
| 		}); | ||||
| 		//if(type == 1, {resSeqs = resSeqs.add([0, 0, 16])}); | ||||
| 		resSeqs | ||||
| 	}; | ||||
| 
 | ||||
| 	sectionLimits = []; | ||||
| 	sectionSeqIn.slice(nil, 0).add(100000).doAdjacentPairs({arg a, b; sectionLimits = sectionLimits.add([a, b])}); | ||||
| 	sectionLimits.collect({arg timePair, secIndex; | ||||
| 		var startTime, endTime, | ||||
| 		guitarSecSeq, accompLowSecSeq, accompHighSecSeq, | ||||
| 		stringSeq, fretSeq, durSeq, susSeq, trigSeq, openStrings, pattern; | ||||
| 
 | ||||
| 		startTime = timePair.postln[0]; | ||||
| 		endTime = timePair[1]; | ||||
| 
 | ||||
| 		guitarSecSeq = genSectionSec.value(guitarSeqIn, startTime, endTime, 0); | ||||
| 		accompLowSecSeq = genSectionSec.value(accompLowSeqIn, startTime, endTime, 1); | ||||
| 		accompHighSecSeq = genSectionSec.value(accompHighSeqIn, startTime, endTime, 2); | ||||
| 
 | ||||
| 		if(accompHighSecSeq == [], {accompHighSecSeq = [[Rest(-1), 1, 0], [Rest(-1), 1, 0]]}); | ||||
| 
 | ||||
| 		guitarSecSeq.postln; | ||||
| 		accompLowSecSeq.postln; | ||||
| 		accompHighSecSeq.postln; | ||||
| 
 | ||||
| 		openStrings = [1/1, 3/2, 2/1, 5/2, 35/12, 7/2]; | ||||
| 		stringSeq = guitarSecSeq.slice(nil, 0); | ||||
| 		fretSeq = guitarSecSeq.slice(nil, 1); | ||||
| 		durSeq = guitarSecSeq.slice(nil, 2); | ||||
| 		susSeq = calcSustains.value(stringSeq, durSeq); | ||||
| 		//trigSeq = guitarSeq.slice(nil, 3); | ||||
| 		//~player = EventPatternProxy.new; | ||||
| 		pattern = EventPatternProxy.new; | ||||
| 		pattern.source = Ppar([ | ||||
| 			Pbind( | ||||
| 				\instrument, \karplus, | ||||
| 				\amp, 0.3, | ||||
| 				\dur, Pseq(durSeq * 0.08), | ||||
| 				\sustain, Pseq(susSeq * 0.08), | ||||
| 				\freq, Pseq(stringSeq.collect({arg string, index; | ||||
| 					if(string.isRest, {Rest()}, { | ||||
| 						((62.midicps * openStrings[string]).cpsmidi + fretSeq[index]).midicps})})), | ||||
| 				\bus, if(secIndex % 2 == 0, {~guitarBusA.index}, {~guitarBusB.index})), | ||||
| 			if(accompLowSecSeq.size > 1, { | ||||
| 				Pmono( | ||||
| 					\accompBass, | ||||
| 					\amp, 0.5, | ||||
| 					\freq1, Pseq(accompLowSecSeq.slice(nil, 0)), | ||||
| 					\freq2, Pseq(accompLowSecSeq.slice(nil, 1)), | ||||
| 					\dur, Pseq(accompLowSecSeq.slice(nil, 2)) * 0.08, | ||||
| 					\bus, if(secIndex % 2 == 0, {~accompLowBusA.index}, {~accompLowBusB.index})) | ||||
| 			}, { | ||||
| 				Pmono( | ||||
| 					\accompBass, | ||||
| 					\amp, 0.5, | ||||
| 					\freq1, Pseq([accompLowSecSeq[0][0]]), | ||||
| 					\freq2, Pseq([accompLowSecSeq[0][1]]), | ||||
| 					\dur, Pseq([accompLowSecSeq[0][2]]) * 0.08, | ||||
| 					\bus, if(secIndex % 2 == 0, {~accompLowBusA.index}, {~accompLowBusB.index})) | ||||
| 			}), | ||||
| 			Pbind( | ||||
| 				\instrument, \accompTreble, | ||||
| 				\freq, Pseq(accompHighSecSeq.slice(nil, 0)), | ||||
| 				\dur, Pseq(accompHighSecSeq.slice(nil, 1)), | ||||
| 				\sustain, Pseq(accompHighSecSeq.slice(nil, 2)), | ||||
| 				\amp, 0.5, | ||||
| 				\bus, if(secIndex % 2 == 0, {~accompHighBusA.index}, {~accompHighBusB.index})) | ||||
| 		]); | ||||
| 		pattern | ||||
| 	}).postln; | ||||
| }; | ||||
| 
 | ||||
| ) | ||||
| @ -0,0 +1,283 @@ | ||||
| ( | ||||
| ~transcribe = {arg scoreData; | ||||
| 	var rawMusicData, timeSigData, sectionData, dir, basePath, maxSize, openStrings, musicData; | ||||
| 
 | ||||
| 	rawMusicData = scoreData[0]; | ||||
| 	timeSigData = scoreData[1]; | ||||
| 	sectionData = scoreData[2]; | ||||
| 
 | ||||
| 	dir = thisProcess.nowExecutingPath.dirname; | ||||
| 	basePath = dir +/+ ".." +/+ "lilypond"; | ||||
| 
 | ||||
| 	openStrings = [1/1, 3/2, 2/1, 5/2, 35/12, 7/2]; | ||||
| 
 | ||||
| 	maxSize = 0; | ||||
| 	musicData = rawMusicData.collect({arg partData, p; | ||||
| 		var res; | ||||
| 		res = partData.collect({arg item, i; | ||||
| 			var note, rest; | ||||
| 			switch(p, | ||||
| 				0, { | ||||
| 					var string, fret, dur, sus; | ||||
| 					string = item[0]; | ||||
| 					fret = item[1]; | ||||
| 					dur = item[2]; | ||||
| 					sus = item[3]; | ||||
| 
 | ||||
| 					note = sus.collect({[string, fret, i]}); | ||||
| 					//rest = (dur - sus).collect({[-1, -1]}); | ||||
| 				}, | ||||
| 				1, { | ||||
| 					var freq, dur, sus; | ||||
| 					freq = item[0]; | ||||
| 					dur = item[1]; | ||||
| 					sus = item[2]; | ||||
| 
 | ||||
| 					note = sus.collect({[freq, i]}); | ||||
| 					if(p < rawMusicData.size, {rest = (dur - sus).collect({[-1, i]})}, {[]}); | ||||
| 				}, | ||||
| 				2, { | ||||
| 					var freq1, freq2, dur, sus; | ||||
| 					freq1 = item[0]; | ||||
| 					freq2 = item[1]; | ||||
| 					dur = item[2]; | ||||
| 					sus = 4; | ||||
| 
 | ||||
| 					note = sus.collect({[[freq1, freq2 - freq1], i]}); | ||||
| 					if(p < rawMusicData.size, {rest = (dur - sus).collect({[-1, i]})}, {[]}); | ||||
| 				} | ||||
| 			); | ||||
| 
 | ||||
| 			note ++ rest | ||||
| 		}).flatten; | ||||
| 		if(res.size > maxSize, {maxSize = res.size}); | ||||
| 		//res = res.extend(res.size.trunc(16) + 16, res.last) | ||||
| 		res | ||||
| 	}); | ||||
| 
 | ||||
| 
 | ||||
| 	musicData = musicData.collect({arg partData, p; | ||||
| 		var lastSectionSize, lastSectionSizeTrunc, finalSectionSize, ext; | ||||
| 		partData[(partData.size - 10)..]; | ||||
| 		lastSectionSize = (maxSize - sectionData.last[0]); | ||||
| 		lastSectionSizeTrunc = lastSectionSize.trunc(16); | ||||
| 		finalSectionSize = if(lastSectionSize != lastSectionSizeTrunc, {lastSectionSizeTrunc + 16}, {lastSectionSize}); | ||||
| 		ext = finalSectionSize - lastSectionSize; | ||||
| 		partData.extend((maxSize + ext), if(p == 0, {partData.last}, {[-1, partData.last[1]]})) | ||||
| 	}); | ||||
| 
 | ||||
| 	musicData.do({arg part, p; | ||||
| 		var amps, harm, modi, timeSigIndex, sectionCount, sectionIndex, subSectionIndex, curTimeSig, | ||||
| 		lilyFile, lilyString, voices, lastVal, lilyNotes, lilyOcts, lilyGString, isHarmonic, measureCount, | ||||
| 		lilyNote, lilyDur, lilyRest, lilyBeatingMark, curTime = 0, noteTuples, markupSuffixes; | ||||
| 
 | ||||
| 		//create file | ||||
| 		lilyFile = switch(p, | ||||
| 			0, {File(basePath +/+ "includes" +/+ "cicc_guitar.ly".standardizePath,"w")}, | ||||
| 			1, {File(basePath +/+ "includes" +/+ "cicc_high.ly".standardizePath,"w")}, | ||||
| 			2, {File(basePath +/+ "includes" +/+ "cicc_low.ly".standardizePath,"w")} | ||||
| 		); | ||||
| 
 | ||||
| 		//start lilypond directives | ||||
| 		lilyString = ""; | ||||
| 
 | ||||
| 		lastVal = nil; | ||||
| 
 | ||||
| 		//start voice | ||||
| 		lilyString = lilyString ++ "\n{ "; | ||||
| 		lilyString = lilyString ++ "\n\\set Score.markFormatter = #format-mark-box-numbers "; | ||||
| 
 | ||||
| 		lilyString = lilyString + "\\tempo 8 = 90\n"; | ||||
| 		if(p != 1, {lilyString = lilyString + "\\override Staff.TimeSignature #'stencil = ##f"}); | ||||
| 		//lilyString = lilyString + "\\numericTimeSignature \\time 4/4\n \\mark \\default \n"; | ||||
| 		lilyString = lilyString + "\\numericTimeSignature \\time 4/4\n"; | ||||
| 
 | ||||
| 		lilyString = switch(p, | ||||
| 			0, {lilyString + "\\clef treble\n"}, | ||||
| 			1, {lilyString + "\\clef \"treble^8\"\n"}, | ||||
| 			2, {lilyString + "\\clef bass\n"} | ||||
| 		); | ||||
| 
 | ||||
| 		lilyNotes = ["c", "cis", "d", "dis","e", "f", "fis", "g", "gis", "a", "ais", "b"]; | ||||
| 		lilyOcts = [",,", ",", "", "'", "''", "'''", "''''"]; | ||||
| 
 | ||||
| 		timeSigIndex = 0; | ||||
| 		sectionCount = 0; | ||||
| 		sectionIndex = 1; | ||||
| 		subSectionIndex = 1; | ||||
| 		curTimeSig = 4; | ||||
| 		measureCount = 0; | ||||
| 		part.clump(4).do({arg beat, i; | ||||
| 			var gSum = 0; | ||||
| 
 | ||||
| 			//beat.postln; | ||||
| 			beat.separate({arg a, b; ((a[0] != -1) || (b[0] != -1)) && (a != b)}).do({arg group, g; var noteLength, target = 0; | ||||
| 				noteLength = group.size; | ||||
| 				gSum = gSum + noteLength; | ||||
| 
 | ||||
| 				//add ties | ||||
| 				lilyString = lilyString ++ if((group[0] == lastVal) && (group[0][0] != -1), {"~ "}, {""}); | ||||
| 				//add barcheck count | ||||
| 				lilyString = lilyString ++ if((curTime % curTimeSig == 0) && (i != 0), {measureCount = measureCount + 1; "| "}, {""}); | ||||
| 				//lilyString = lilyString ++ if((curTime % curTimeSig == 0) && ((measureCount % 4) == 0) && (i != 0), {"\n\\break \n"}, {""}); | ||||
| 
 | ||||
| 				if((i == (sectionData[sectionCount][0] / 4)) && (g == 0),{ | ||||
| 					var barType, pageBreak; | ||||
| 					barType = switch(sectionData[sectionCount][1], 0, {"\"||\""}, 1, {"\".|\""}, -1, {"\"|.|\""}); | ||||
| 					pageBreak = switch(sectionData[sectionCount][1], 0, {""}, 1, {""}, -1, {measureCount = 0; "\n\\pageBreak \n"}); | ||||
| 					isHarmonic = switch(sectionData[sectionCount][1], 0, {false}, 1, {true}, -1, {false}); | ||||
| 					lilyString = lilyString + " \\bar " ++  barType ++ " \\mark \\markup { \\bold \\box " ++ sectionIndex ++ "." ++ subSectionIndex ++ " }" ++ pageBreak; | ||||
| 					if(sectionCount < (sectionData.size - 1), {sectionCount = sectionCount + 1}); | ||||
| 					switch(sectionData[sectionCount][1], | ||||
| 						0, {subSectionIndex = subSectionIndex + 1}, | ||||
| 						1, {subSectionIndex = subSectionIndex + 1}, | ||||
| 						-1, {sectionIndex = sectionIndex + 1; subSectionIndex = 1}) | ||||
| 				}); | ||||
| 
 | ||||
| 				if((i == (timeSigData[timeSigIndex][0] / 4)) && (g == 0),{ | ||||
| 					timeSigData[timeSigIndex][0]; | ||||
| 					curTimeSig = timeSigData[timeSigIndex][1]; | ||||
| 					lilyString = lilyString + "\n\\time " ++ curTimeSig.asString ++ "/4\n"; | ||||
| 					if(timeSigIndex < (timeSigData.size - 1), {timeSigIndex = timeSigIndex + 1}); | ||||
| 					curTime = 0; | ||||
| 				}); | ||||
| 
 | ||||
| 				switch(p, | ||||
| 					0, { | ||||
| 						lilyNote = lilyNotes[(((62.midicps * openStrings[group[0][0]]).cpsmidi + group[0][1]).round(1) % 12)];// * 2]; | ||||
| 						lilyNote = lilyNote ++ lilyOcts[(((62.midicps * openStrings[group[0][0]]).cpsmidi + group[0][1]).round(1) / 12).asInteger - 2]; | ||||
| 					}, | ||||
| 					1, { | ||||
| 						if(group[0][0] != -1, { | ||||
| 							lilyNote = lilyNotes[((group[0][0].cpsmidi).round(1) % 12)];// * 2]; | ||||
| 							lilyNote = lilyNote ++ lilyOcts[(((group[0][0]).cpsmidi).round(1) / 12).asInteger - 2]; | ||||
| 						},{lilyNote = "r"}); | ||||
| 					}, | ||||
| 					2, { | ||||
| 						if(group[0][0] != -1, { | ||||
| 							lilyNote = lilyNotes[((group[0][0][0].cpsmidi).round(1) % 12)];// * 2]; | ||||
| 							lilyNote = lilyNote ++ lilyOcts[(((group[0][0][0]).cpsmidi).round(1) / 12).asInteger - 2]; | ||||
| 							lilyBeatingMark = "^ \\markup{ " ++ group[0][0][1].round(0.1) ++ " } "; | ||||
| 						},{lilyNote = "r"}); | ||||
| 					} | ||||
| 				); | ||||
| 
 | ||||
| 				//duration | ||||
| 				lilyDur = switch(noteLength, 1, {"16 "}, 2, {"8 "}, 3, {"8. "}, 4, {"4 "}); | ||||
| 				//append rest directive | ||||
| 				lilyRest = ""; | ||||
| 				lilyGString = if(((group[0] != lastVal) && (p == 0)), { | ||||
| 					var stringString, fretString; | ||||
| 					stringString = ["VI ", "V ", "IV ", "III ", "II ", "I "][group[0][0]]; | ||||
| 					fretString = group[0][1].asString; | ||||
| 					if(isHarmonic, {fretString = "\\musicglyph \"noteheads.s0harmonic\""}); | ||||
| 					"_\\markup{\\concat{ " ++ stringString ++ " \\super " ++ fretString ++ "}} " | ||||
| 				}, {""}); | ||||
| 
 | ||||
| 				if((p != 2) || (lilyNote == "r"), { | ||||
| 					lilyString = lilyString ++ lilyNote ++ lilyDur ++ lilyGString; | ||||
| 				}, { | ||||
| 					lilyString = lilyString ++ " <<{ " ++ lilyNote ++ lilyDur ++ lilyBeatingMark ++ " } \\new Voice { \\voiceTwo " ++ | ||||
| 					lilyNote ++ lilyDur ++ " }>> \\oneVoice " ++ lilyGString; | ||||
| 				}); | ||||
| 
 | ||||
| 				//beam group | ||||
| 				if((g == 0) && (noteLength != 4), {lilyString = lilyString ++ " [ "}); | ||||
| 				if((gSum == 4) && (noteLength != 4), {lilyString = lilyString ++ " ] "}); | ||||
| 
 | ||||
| 				lastVal = group[0]; | ||||
| 				curTime = curTime + (noteLength / 4); | ||||
| 			}); | ||||
| 		}); | ||||
| 
 | ||||
| 		//end voice | ||||
| 		lilyString = lilyString ++ " ] \\bar \"|.\" } \n"; | ||||
| 
 | ||||
| 
 | ||||
| 		noteTuples = [lilyNotes, lilyOcts].allTuples.collect({arg val; val.join}).join("|"); | ||||
| 
 | ||||
| 		markupSuffixes = ["VI ", "V ", "IV ", "III ", "II ", "I "].collect({arg stringString; | ||||
| 			(["\\\\musicglyph \\\"noteheads.s0harmonic\\\""] ++ (0..14)).collect({arg fret; | ||||
| 				"_\\\\markup{\\\\concat{ " ++ stringString ++ " \\\\super " ++ fret.asString ++ "}}"})}).flatten.join("|"); | ||||
| 
 | ||||
| 		lilyString.findRegexp( | ||||
| 			"(" ++ noteTuples ++ ")4 (" ++ markupSuffixes ++ ") ~ " ++ | ||||
| 			"(" ++ noteTuples ++ ")4 ~ (" ++ noteTuples ++ ")4 ~ (" ++ noteTuples ++ ")4 ~ (" ++ noteTuples ++ ")4" | ||||
| 		).clump(7).do({arg match; | ||||
| 			lilyString = lilyString.replace(match[0][1], match[1][1] ++ "2. " ++ match[2][1] ++ " ~ " ++ match[1][1] ++ "2")}); | ||||
| 
 | ||||
| 		lilyString.findRegexp( | ||||
| 			"(" ++ noteTuples ++ ")4 (" ++ markupSuffixes ++ ") ~ (" ++ noteTuples ++ ")4 ~ (" ++ noteTuples ++ ")4 ~ (" ++ noteTuples ++ ")4" | ||||
| 		).clump(6).do({arg match; | ||||
| 			lilyString = lilyString.replace(match[0][1], match[1][1] ++ "1 " ++ match[2][1])}); | ||||
| 
 | ||||
| 		lilyString.findRegexp( | ||||
| 			"(" ++ noteTuples ++ ")4 (" ++ markupSuffixes ++ ") ~ (" ++ noteTuples ++ ")4 ~ (" ++ noteTuples ++ ")4" | ||||
| 		).clump(5).do({arg match; | ||||
| 			lilyString = lilyString.replace(match[0][1], match[1][1] ++ "2. " ++ match[2][1])}); | ||||
| 
 | ||||
| 		lilyString.findRegexp("(" ++ noteTuples ++ ")4 (" ++ markupSuffixes ++ ") ~ (" ++ noteTuples ++ ")4").clump(4).do({arg match; | ||||
| 			lilyString = lilyString.replace(match[0][1], match[1][1] ++ "2 " ++ match[2][1])}); | ||||
| 
 | ||||
| 
 | ||||
| 		//consolidate notes | ||||
| 		lilyString.findRegexp( | ||||
| 			"(" ++ noteTuples ++ ")4 ~ (" ++ noteTuples ++ ")4 ~ (" ++ noteTuples ++ ")4 ~ (" ++ noteTuples ++ ")4 ~ (" ++ noteTuples ++ ")4" | ||||
| 		).clump(6).do({arg match; | ||||
| 			lilyString = lilyString.replace(match[0][1], match[1][1] ++ "2. ~ " ++ match[1][1] ++ "2")}); | ||||
| 
 | ||||
| 		lilyString.findRegexp( | ||||
| 			"(" ++ noteTuples ++ ")4 ~ (" ++ noteTuples ++ ")4 ~ (" ++ noteTuples ++ ")4 ~ (" ++ noteTuples ++ ")4" | ||||
| 		).clump(5).do({arg match; | ||||
| 			lilyString = lilyString.replace(match[0][1], match[1][1] ++ "1")}); | ||||
| 
 | ||||
| 		lilyString.findRegexp("(" ++ noteTuples ++ ")4 ~ (" ++ noteTuples ++ ")4 ~ (" ++ noteTuples ++ ")4").clump(4).do({arg match; | ||||
| 			lilyString = lilyString.replace(match[0][1], match[1][1] ++ "2.")}); | ||||
| 
 | ||||
| 		lilyString.findRegexp("(" ++ noteTuples ++ ")4 ~ (" ++ noteTuples ++ ")4").clump(3).do({arg match; | ||||
| 			lilyString = lilyString.replace(match[0][1], match[1][1] ++ "2")}); | ||||
| 
 | ||||
| 
 | ||||
| 		//consolidate rests | ||||
| 		lilyString.findRegexp("r4 r4 r4 r4 r4").clump(2).do({arg match; | ||||
| 			lilyString = lilyString.replace(match[0][1], "r2. r2")}); | ||||
| 
 | ||||
| 		lilyString.findRegexp("r4 r4 r4 r4").clump(2).do({arg match; | ||||
| 			lilyString = lilyString.replace(match[0][1], "r1")}); | ||||
| 
 | ||||
| 		lilyString.findRegexp("r4 r4 r4").clump(2).do({arg match; | ||||
| 			lilyString = lilyString.replace(match[0][1], "r2.")}); | ||||
| 
 | ||||
| 		lilyString.findRegexp("r4 r4").clump(2).do({arg match; | ||||
| 			lilyString = lilyString.replace(match[0][1], "r2")}); | ||||
| 
 | ||||
| 
 | ||||
| 		lilyString.findRegexp("\\| r1").clump(2).do({arg match; | ||||
| 			lilyString = lilyString.replace(match[0][1], "| R1")}); | ||||
| 
 | ||||
| 		lilyString.findRegexp("4\nr1").clump(2).do({arg match; | ||||
| 			lilyString = lilyString.replace(match[0][1], "4\n R1")}); | ||||
| 
 | ||||
| 		//write file | ||||
| 		lilyFile.write(lilyString); | ||||
| 		lilyFile.close; | ||||
| 	}); | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| ~genScoreData = {arg guitarSeq, accompLowSeq, accompHighSeq, timeSigInsSeq, sectionSeq; | ||||
| 	var stringSeq, fretSeq, durSeq, | ||||
| 	partData, timeSigData, sectionData; | ||||
| 	stringSeq = guitarSeq.slice(nil, 0); | ||||
| 	fretSeq = guitarSeq.slice(nil, 1); | ||||
| 	durSeq = guitarSeq.slice(nil, 2); | ||||
| 	partData = [ | ||||
| 		[stringSeq, fretSeq, durSeq, durSeq].flop, | ||||
| 		accompHighSeq.collect({arg item; [item[0], (item[1] / 0.08).round.asInteger, (item[2] / 0.08).round.asInteger]}), | ||||
| 		accompLowSeq | ||||
| 	]; | ||||
| 	timeSigData = timeSigInsSeq; | ||||
| 	sectionData = sectionSeq; | ||||
| 	[partData, timeSigData, sectionData] | ||||
| }; | ||||
| ) | ||||
					Loading…
					
					
				
		Reference in New Issue