Any correspondence of this blog's name to names of individuals, organizations, companies, products or other blogs is pure coincidence. Except where explicitly noted, all material posted on this site is available under a creative commons attribution sharealike license. If you believe I've infringed on your copyright please notify me.
Since I'm sure I will forget this information, I'm putting it online where I know I will find it back. After each step, also check the effect in the mix (i.e. together with other instruments). A subtle effect is usually better than an over-the-top effect. The information here is summarized from https://www.youtube.com/watch?v=qdDDVortvRU . Be sure to check out their video for sound examples.
Step 1: remove rumble
Use a high pass filter (aka low cut filter). Increase the cut-off frequency until you just start to hear the difference, then reduce it a bit. That's right, aim for not hearing the effect. This ensures that you only remove rubbish, and don't remove valuable data. A typical cut-off frequency will be around 80Hz-120Hz.
When done, check the effect in the mix.
Step 2: give glitter
For this purpose use a high shelving filter. Try to boost frequencies above 8kHz with anything from 1dB to about 6dB. If you want a more subtle effect, try to boost above 12kHz-16kHz instead.
When done, check the effect in the mix.
Step 3: sweep sound
Use a small bandpass filter, vary its center frequency and search for frequency bands that obviously stand out compared to other frequency bands. You can attenuate these a bit. A typical action is to attenuate around 800Hz-1kHz.
When done, check the effect in the mix.
Step 4: special fx
This step is optional.
To make sound brighter, try to boost 2kHz-5kHz.
To make vocal sit better in the mix in quieter passages, try cutting between 100Hz-250Hz
It's been a while but I finally found some time to write, practice and record a new piece. All things music have been on a break for a while now, and I'm glad that I can take a break from taking a break.
The piece started as a sad ending theme for a video game. It was never used for that purpose and so I decided to rework it into something longer. Maybe it's interesting if I tell you how I think about the music, bar by bar. (Then again, maybe it's not ;) Feel free to skip the explanations. Most of all, I'm also curious how much of this I will still recognize in a year or in 5 years. I may even come back to my description and update it as my insights change.)
Bars 1-4: The piece starts off quite melancholic (which was a requirement for the sad ending of the video game). This part is written in C minor key, a key that is traditionally regarded as the key in which to express a declaration of love with lament of unhappy love, sighing of the lovesick soul. Clearly someone is thinking back about something.
Bars 5-8: The beginning is repeated with a slight variation in the accompaniment to avoid making it sound the same twice. It is as if the accompaniment adds more detail to the memories as they are repeated.
Bars 9-12: Suddenly the melancholic fantasy is interrupted with a little waltz. A short distraction? Or perhaps a related memory, a sudden free association.
Bars 13-20: The distracting thoughts are pushed away and make place again for the fantasy. As the fantasy repeats itself, the melody notes again add more details to the memories. By coloring the melody using notes outside the scale, the color of the memories changes. Little imperfections that keep the story alive as it were.
Bars 21-27: The fantasy continues. The fantasizing person remembers and overthinks some of the consequences that resulted from whatever happened in bars 13-20.
Bars 27-32: Stress level increases a bit. Temper gets a bit heated.
Bars 33-34: Some soothing thoughts manage to calm down the person.
Bars 35-38: There's our distraction waltz again. It's barely interesting enough to keep our thoughts away from what happened.
Bars 39-48: The fantasy is resumed, but in bar 45 it suddenly takes a different path. The person has second thoughts about how everything really went back then. For a while, things are remembered as perhaps more festive than before (bars 47-48).
Bars 49-52: These finish the first fantasy and prepare the music to change into a different key of f minor. F minor is the key in which one traditionally expresses deep depression, funeral lament, groans of misery and longing for the grave. No doubt the passage that follows will have a sinister side to it.
Bars 52-85: A buildup of emotions, a waterfall of notes follows. In the left hand we have a sad but very static accompaniment with typical f minor notes. In the right hand, in bars 53-64, we also have very dissonant chords which work to create a somewhat uneasy feeling. In bars 65-76, the dissonant chords are now replaced with a locrian motif that further increases the uneasyness in the music. In bar 74, the deepest note of the piece (a very low "d") is reached. Then bars 77-85 repeat the same techniques but a fifth higher and with many more, and much faster notes, which adds even more drama to the already dramatic state of mind of our fantast. The fifth higher brings us in the key of Bb minor, which traditionally is used to express feelings of mocking God and the world, discontented with itself and everything, preparation of suicide. Quite restless and dramatic indeed :)
Bars 86-91: The deepest darkest memories subside and make place again for the sweeter earlier theme.
Bars 92-113: The earlier theme is repeated, but again the colors have changed to something more bitter-sweet. This time the chords in the right hand sound much more yearning than in the beginning of the piece. As if the darkest memories increased the feeling of having lost something valuable and make it more painful to think back about what was lost.
Bars 114-117: Eventually, the person snaps out of his trip through memory lane and we hear the waltz playing again.
Bar 118: The piece ends with some bitter sweet ending chords. A near happy end, and time to get back to work ;)
Olivier Messiaen was a French composer (December 10, 1908 – April 27, 1992), known for inventing a new musical language. He wrote a book about his ideas on rhythm, melody and harmony and is generally regarded as one of the great innovators in music. He drew inspiration mostly from his Christian beliefs and from bird songs. I personally fell in love with this musical language after hearing his work "Vingt Regards sur l'Enfant-Jésus".
One key element of his compositions is a set of scales that he "invented" (or rather, selected from the vast space of possible scales). They consist of symmetrical note groups. While writing music he would often adhere to using only notes from one or more of his scales, leading to special music (with very rewarding harmonies).
I was curious about these special scales and wondered about the mechanisms that cause the scales to "work so well" with a listener, so
I set up my own private investigation and took a close look at his scales.
I discovered quite a number of interesting things (which may be known already in literature, I don't want to claim I found something new, but they were certainly new to me)
Inspired by youtube composer Rolando Gonzalez' recent videos, I set out to write something in classical ("Mozart") style... but as I started working, I felt the piece heading itself in a very different direction. Sorry Mozart, you have been postponed ;)
This blog entry is about to describe an experiment I did with the real time audio synthesis and algorithmic composition programming languagesupercollider. Before you read on, please realize that this stuff is highly addictive.
So you've always wanted to sing in a choir, but didn't have the
opportunity or courage to join one near you? Here's an easy way to turn
your singing into a choir piece in real time using supercollider.
The system is based on the following example from the supercollider documentation:
s.boot; ( SynthDef("pitchFollow1",{ var in, amp, freq, hasFreq, out; in = Mix.new(SoundIn.ar([0,1])); amp = Amplitude.kr(in, 0.05, 0.05); # freq, hasFreq = Pitch.kr(in, ampThreshold: 0.02, median: 7); //freq = Lag.kr(freq.cpsmidi.round(1).midicps, 0.05); out = Mix.new(VarSaw.ar(freq * [0.5,1,2], 0, LFNoise1.kr(0.3,0.1,0.1), amp)); 6.do({ out = AllpassN.ar(out, 0.040, [0.040.rand,0.040.rand], 2) }); Out.ar(0,out) }).play(s); )
This example does something very interesting: it reads sound from your microphone using the SoundIn command, then tracks its frequency using the Pitch command and then synthesizes a new sawtooth wave at different multiples of the detected frequency. The new sawtooth wave is then sent to the speakers, allowing you to hear the sawtooth following your voice's pitch.
Upon hearing this, I immediately thought of harmonizing singing voice in real time, with the possibility to harmonize every note differently, so as to arrive at an (hopefully somewhat interesting) choir piece.
So I sat out to improve the example (combine it with pitch-shifting instead of synthesizing a new sawtooth wave, and add a bit of a GUI to it, to allow reconfiguring the harmonization on the fly), and came up with the following.
Please note that I'm very new to the supercollider programming language, and I'm glad for any suggestions you may have w.r.t. code style! The following code can also be cloned/forked from the github repository.
s.boot;
( var table; var gap = 40; var mapped, mapped2, diffbuf, diffbuf2; var miditoname; var nametomidi; var sound; var difference, difference2; var tf, tf2;
// define a function to convert a midi note number to a midi note name miditoname = ({ arg note = 60, style = \American ; var offset = 0 ; var midi, notes; case { style == \French } { offset = -1} { style == \German } { offset = -3} ; midi = (note + 0.5).asInteger; notes = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];
(notes[midi%12] ++ (midi.div(12)-1+offset)) });
// define a function to convert a midi note name to a midi note number nametomidi = ({ arg name = "C4", style = \American ; var offset = 0 ; // French usage: +1 ; German usage: +3 var twelves, ones, octaveIndex, midis;
// define a table to store the difference between reference and mapped note difference = Array.fill(table.size, {0}); // define a buffer on the server for consultation from the SynthDef diffbuf= Buffer.loadCollection(s,table,action:{|msg| msg.postln;}); difference2= Array.fill(table.size, {0}); diffbuf2=Buffer.loadCollection(s,table,action:{|msg| msg.postln;}); tf = List.new(table.size); tf2 = List.new(table.size);
// define a window called "Setup mapping" w = Window.new("Setup mapping", Rect(200,200,15*gap,190)); // add the reference notes as labels (fixed), and the mapped notes as text fields (editable) // whenever a text field is updated, update the list of mapped notes (mapped) table.do({arg item, i; var t, u; StaticText(w, Rect(10+gap*i, 10, gap, 30)).string_(miditoname.value(item));
t = TextField(w, Rect(10+gap*i, 50, gap, 30)).string_(miditoname.value(mapped[i])); t.action = { mapped[i] = nametomidi.value(t.value); ("upper map note number " ++ i ++ " from " ++ table[i] ++ " to " ++ mapped[i]).postln; diffbuf.set(i, (table[i] - mapped[i]).midiratio.reciprocal)}; tf.add(t);
u = TextField(w, Rect(10+gap*i, 90, gap, 30)).string_(miditoname.value(mapped2[i])); u.action = { mapped2[i] = nametomidi.value(u.value); ("lower map note number " ++ i ++ " from " ++ table[i] ++ " to " ++ mapped2[i]).postln; diffbuf2.set(i, (table[i]-mapped2[i]).midiratio.reciprocal); tf2.add(u); }; }); // add a button to play a reference note c = Button(w, Rect(10,130,100,30)).states_([["Play C4",Color.black,Color.gray]]); c.action_({arg butt; if (butt.value == 0, { var env = Env.perc; SinOsc.ar(nametomidi.value("c4").midicps)*EnvGen.kr(env, doneAction:2)!2; }.play, {}) });
// also add a start/stop button // when the button is set to start, instantiate a new Synth, otherwise free the Synth b= Button(w, Rect(110,130,100,30)).states_([ ["Start",Color.black, Color.red], ["Stop",Color.black, Color.green]]); b.action_({arg butt; if (butt.value == 1, { tf.do({arg item; item.action}); tf2.do({arg item; item.action}); table.do({arg item, i; difference2[i] = (table[i] - mapped2[i]).midiratio.reciprocal; difference[i] = (table[i] - mapped[i]).midiratio.reciprocal; }); diffbuf.setn(0,difference); diffbuf2.setn(0,difference2); sound = Synth.new("pitchFollow1"); }, { sound.free;} ) });
// define the Synth itself: // - first it determines the pitch of what it hears in the microphone // - then it harmonizes the pitch with the notes as defined in the ui SynthDef.new("pitchFollow1",{ var in, amp, freq, hasFreq, out; var t, midinum; var harmony, harmony2, partials; in = Mix.new(SoundIn.ar([0,1])); amp = Amplitude.kr(in, 0.05, 1); # freq, hasFreq = Pitch.kr(in); midinum = freq.cpsmidi.round(1); midinum.postln; freq = Lag.kr(midinum.midicps, 0.05); //freq = midinum.midicps; harmony2= WrapIndex.kr(diffbuf2.bufnum, midinum); harmony = WrapIndex.kr(diffbuf.bufnum, midinum); partials = [ 0.5, 1, 0.5*harmony, 1*harmony, 0.5*harmony2, 1*harmony2, ]; out = Mix.new(PitchShift.ar(in, 0.2, partials, 0, 0.004));
7.do({ out = AllpassN.ar(out, 0.040, [0.040.rand,0.040.rand], 2) });
Out.ar(0,out/partials.size)
}).add;
// make the ui visible w.front;
)
Here's a sound example. It's not perfect, obviously, but to hear the computer create this in real time while you sing into the microphone is quite cool...
The style uses some harmonic ideas from jazz, and features quickly changing time signatures. Difficulties in performing come from the requirements in precise pedaling, the ever-changing time signatures, and some awkward jumps in the left hand (in combination with the speed).