title: These are the words creator: Martin Kraken, ganje, spurkopf et al. comment: Gemeinschaftlich produzierter Song auf sequencer.de/forums remix: Neusiker's "Swinging wire phones" # This is my way of making neusic: Feeding textual data to some python # script in conjunction with some modules written by myself as well and some # installed from the official python modules repository. Only modules have # been considered for use, the documentation of which does not tell they # serve musicians. Because modules that do would presumably make me obey to # thinking paths how to make music. Essentially the script is called with # the text describing the music and grills my multi-core CPU and, while I am # drinking ... well ... no cup of coffee, too curious and alert I am, # finally writes out a ready-to-play file in WAV/OGG/AIFF/whatever format. # While rendering, it does not play music. This is not a real-time # interactive thing at all, it is rather the way it worked in the sixties, # just that the code was far more technically than musically oriented in # those days. No matter if modern or old, I favour a way or another. # I do not care for suitability of the program for others' use, nevertheless # I uploaded it on https://gitlab.com/flowdy/sompyler as public backup – to # inspire others, but with limited support in using the program or adapting # it to their needs. UI-wise it is a nightmare, and so it is syntax in its # catacombs but it is just okay for myself. # I encourage everyone to learn to program their own metal for their own use # solely, just one non-essential piece of software for a start. Using # foreign software means for all of us (me too) to let go off control of # ourselves to someone we would not even recognize on the street. Weren't we # told as kids not to go with foreign people, as adults we decide to let # others reign over our ways of thinking. Do not get me wrong, as social # beings we are talented in adapting ways of thinking, practicing non-stop. # This data is in a custom descriptive language based on plain YAML. What # you read here is English. English is always separated from the code by the # '#' sign. Left is the code, right is English – if any on each sides. So, # a line starting with (whitespace and) '#' only contains English, a line # without a hash symbol only contains code. Comments are ignored by the # program, they're meant for technically adept humans with a command of # English. And yes, the sharp sign of notes can be distinguished from that # comment sign because in the latter case there is whitespace before or the # start of the line. # The metadata at the beginning of the file is not commented, hence fed to # the script. But it is not interpreted in any way, as it is only metadata # to catalogue later by a user-chosen program to manage a library of score # files. # What is interpreted, is stage as the only required metadata in the first # YAML document stream item, plus any inlined instrument definitions that # can be referred to from voice entries in the stage definition. stage: # It defines the voices on the stage. p: direction: 1|1 # in the middle distance: 0 # close to listener instrument: fh/sonor2 # short for /path/to/sompyler/lib/instruments/ # sonor2.spli articles: # note-heads are associated certain properties that may be # static or change from tick to tick in a measure, expressed # with a gradient a: { whe: "3;1,7;4,10" } # gradually renders to parameter 'whe' values # each for all the tick positions in a # measure. 'whe' is an arbitrary name for a # parameter, short for "whatever". For # emulation of orchestra instruments # parameter names should reflect practice # techniques e.g. "bowbend" for strings. b: { whe: "8;2,6;8,3", add_stress: -5 } # note-head "b" notes be 5dBFS # softer than they would be without (note # head 'o': note with*o*ut special properties) d: direction: 2|1 # Twice as loud from the left as from the right. Or # according phase shift when reverb is used. distance: 1 # twice the distance from listener compared to distance # of closest voice(s), p (2 would be thrice and so forth) instrument: drums # see `instrument drums` description below articles: a: { f2tf: '10-1' } # depending on the position of the notehead "a" # note in a measure, the note gets property f2tf: # 10 on beat 1 down to 1 on the last tick. o: { f2tf: '8,1;9,10' } b: 3|4 0.5 bass # short form for { direction: '3|4', distance: 0.5, instrument: 'bass' } instrument drums: NOT_CHANGED_SINCE: 2022-08-09 20:25:00 # important to determine which notes # needs to be re-rendered character: - SPREAD: [-67, +183, +343, -591, 98, 34, -145, -45, 360, 230] # fundamental -67 cent detuned, first harmonic -67 +183 cent and # so forth VOLUMES: 10:110;1,98;3,85;6,83 # All values (110, 98, ...) map to the # upside-down dBFS scale. 110 => x - 100 = # 10dBFS, finally normalized to 0dBFS # because 110 is the maximum, other values # accordingly. A: 0.005:1,8;3,9 # attack transient, length 5ms. Start value = 0 (":0;") # implied PROFILE: # shapes properties of single oscillation depending on order # of the partial - match: 1 # for fundamental apply ... S: 12;1,4*2;5,3 # sustain phase, expressed in x,y[,*z or 1] bézier # coordinates rendered into a gradient of amplitude # (on the -dBFS scale) by using Bézier-Bernstein # approximation. O: noise # Oscillator type - match: 10 # for the 10th partial ... (1st to 9th get # interpolated settings) S: 0.4:17;1,5;7,4 O: sine # for partials 1st to 9th mixes of noise and sine # will be used with appropriate shares of both A: 0.003:1,8*2;3,9 - match: 3n-1 # applies to 2nd, 5th and 8th harmonic V: -7 # reduce amplitude by 7dBFS (let's pretend I hear that) R: 0.2:5;4,4;5,0 # release phase applies to all harmonics - ATTR: f2tf # parameter name is arbitrarily chosen "four to the floor", # but that does not mean anything. We just need to name a # parameter, and it *should* get a mnemonic, # intuitive name. Here, I failed, preferred my creativity to # be invested otherwise. 10: FM: 6.31f[10;1,5*2;4,0];19:1 # frequency and amplitude modulation 0: # syntax is not covered here, too FM: 4.71f[10;1,1*2;4,0];0:1 # complex. The smartest will guess # alright. # interpolate frequency modulation settings for f2tf between 0 and 10 instrument bass: NOT_CHANGED_SINCE: 2022-08-24 19:31:00 SPREAD: [-7, 1, 0, 2, 3, 3, 4, 5, 10, 10, 11, 11, 12, 13, 13, 13, 14] VOLUMES: "18:100;1,95;2,92;3,86;6,82;7,80;10,74;18,68" TIMBRE: 5000:100;3,94;4,100!;5,96;7,88;8,96;9,98!;13,88;15,94!;16,87;80,73 # defines the formants, i.e. which harmonics to strengthen/weaken by # how many dBFS depending on their absolute frequency R: 0.4:10;1,9;2,0 PROFILE: - { match: 1, A: "0.03:1,8;2,10", S: "3:10;2,3*3;3,3", V: 30 } - [17, 13, 7, 0, -2, 3, 1, 1, -1, -5, -9, -7, -5, -2, -1, -3, 0] - { match: 18, A: "0.015:1,9;2,10", S: "3:100;1,63*2;10,53" } tuning: # let's select just tuning. The advantange intervals: just5lim # of off-line approaches. Noone with their gear # park studio would achieve that so easily. # 5-limit means that all steps' relations to the # tonic have integer 2 to 5 as divisor. # The tonic needs to be changed for certain harmonies. room: # specification of how the reverberation needs to be shaped. levels: 100:110;1,50*2;2,75;4,60;5,30;15,0 # how many responses stack # with what levels delays: 1.45:109;1,190;4,15;9,12;10,7;11,5;15,3 freq_lanes: # every response in the chain can have their own equalization - 20:5;1,4 # this is a 20-band equalizer - 7:3;5,2;8,1;9,0 # here, too, read 7 and - 1:1;1,0;2,0 # 7+1 as ratios over 8. border: 35:5+1;0,0;1,1;2,1!;6,1 # haas shift to equalize down with time # with 0:... (instead of 35ms phase diff) # we would get mono indeed. --- # M. 1: P1 L1 M1 # Measure 1, i.e. page 1, line 1, measure 1 in the piano # arrangement by spurkopf _meta: beats_per_minute: 100 # bpm given in the competition to obey by all # participants stress_pattern: 5,2,3,1;2,0,1,0 # divide every beat into four ticks # the beat one gets 5/5 in the logarithmic # scale lower_stress_bound: 93 # between the unstressed beat level (up-beat), # in -dBFS. In this score it is static, not a # gradient. upper_stress_bound: 100 # and the beat with maximum stress level (5) elasticks_pattern: 1,1,1,1;3,2 # Swing! Render every stressed eighth 50% # longer than the unstressed. (3 is 50% more # than 2) # Trivia: I do not write 50% because I # prefer working with small integers, as # nature does, too. How a small integer # renders to a physically effecting float, # depends on the tempo and variations as # yes, 'beats_per_minute' could be a # gradient, too. offset_seconds: 0.7 # shift start of first sound by 700ms so their is no # click tuning: +6mn....... ........ # croak on notes not in the F# minor scale # also, controls tonic in just tuning p: - F#4 .4a_3*2 < C#4 < A3 # initially play F#4, C#4, A3 as a chord on beats # 2 and 4. notehead "a": see settings above in # articles for voice "p" - F#3 b.__ .. _.*__ .. _. # b, o or _ hit a sound at designated pitch. # Subsequent _ lengthen hit sound by another tick; # . pause a tick we could replace every first _ in # a row by custom notehead 'b', but let's avoid # misspelling. * without number means: repeat # once more what comes before after last # whitespace. With number it means, apply pattern # as many times. d: F#2 a_..*3 _ .3 b: a: 0 =_3+_3 # store a motif into register 'a' to reuse it often 0: < a:F#1m, a:F#1m # 0 as the start note represents F#1 here, 'm'/'&m' # signifies a minor chord, so the '+' represents # the minor third. = (with or without letter # before) always returns to initial pitch, i.e. # F#1. Without, in the repetition, voice climbs up # an other third '0:' means the offset. --- # M. 2: P1 L1 M2 p: - F#4 .4a_3*2 < C#4 < A3 - F#3 b.o_ .. b.*o_ .. --_ d: _articles: o: { f2tf: false } 0: F#2 o_..*3 _ .3 # 2 b: < a:F#1m, a:F#1m --- # M. 3: P1 L1 M3 p: - F#4 .4 a_3-4_3 .4 - F#3 b_4.__..___.__ d: _articles: o: { f2tf: false } a: { f2tf: 10 } 0: F#2 o_a.*3 o.3 # 3 b: b1a: 0 =_2.=_4 b1b: 0 -__=_3 0: < b1a:F#1m, b1b:F#1m7 --- # M. 4: P1 L1 M4 p: - C#4 .. o_3a+_-3_3 .4 # "a+" is a D, 1x "+" = 1 semitone higher - A2 b_4.o., E3 _.__+4_=__ # "+4" is a G#, 4 semitones higher # (Could abbreviate to E3& _.__+_=_, with "&" # being the marker for major chord. But heck, # nope, kids leave that to the adults.) d: _articles: o: { f2tf: false } 0: F#2 o.a_*3 o.(a**)_ # We need the "0: " key (notes from offset 0) # here because we use the "_articles" key, too. b: b2a: 0 =_3++_3 b2b: 2 -_3 ++_3 0: < b2a:A1&, b2b:A1& --- # M. 5: P1 L2 M1 p: - C#4 .4 a_3 o+_7 - F#3 b_3+3_=_-4.__(+7)_b_ d: F#2 a_..*3 _ .3 b: