Recreating the Deep Note sound from THX
3r33414. 3r3-31. If you have ever visited a cinema, you probably heard Deep Note - Sound Trademark companies. Thx . This is one of the first sounds that is heard at the beginning of the trailers in THX certified halls. I always liked his recognizable crescendo, starting with an eerie mixing of notes and ending with a bright and grandiose ending (3r3-39-333369. Sound 3r33399. 3r-312.). What a delight for the ear! 3r3402. 3r33414. 3r3402. 3r33414. Yesterday (probably) without any reason I was interested in the origin of this sound, and I did a little research. I was deeply touched by his story, which I want to share with you. Then we will continue - and we will create this sound ourselves, prepare scissors and glue! 3r3402. 3r33414. blog. Music Thing Blog in 2005. Here is link to the message . 3r3402. 3r33414. 3r3402. 3r33414. Some facts about sound:
3r33414. 3r3402. 3r33414. 3r33939. 3r33414.
He created 3r3338. Dr. James Andy Moorer
in 1982. 3r31-10. 3r33414.
On one of the days in history, he was lost 4000 times a day, almost every 20 seconds! Dr. Murer's quote:
3r33414.
“I would like to say that the sound of THX is the most popular piece of computer music in the world. It may or may not be true, but it sounds cool! ”
3r31-10. 3r33414.
It is created on an ASP (Audio Signal Processor) computer, capable of synthesizing sounds in real time. 3r31-10. 3r33414.
A program of 2?000 lines of C code generated the data to be played on the ASP. The generated data consisted of 25?000 rows that were processed on an ASP. 3r31-10. 3r33414.
Oscillators of voices use a digitized cello tone as a signal. Dr. Murer recalls that there were about 12 harmonics in the sample. ASP could run 30 such oscillators in real time (for comparison, my laptop right now can process more than 1000 of these without failures). 3r31-10. 3r33414.
The sound itself is copyrighted, but here’s the problem: Dr. Murer’s code relies on random number generators (the generative process) and the sound is slightly different each time. Therefore, I do not think that it is safe to say that the process itself is or may be “copyrighted”. The sound itself, yes, the specific sample is protected. 3r31-10. 3r33414.
Sound debuted in the THX trailer. "Return of the Jedi" before his premiere in 1983. 3r31-10. 3r33414.
At some point, the generative characteristics of the process became problematic. After the release of the Return of the Jedi, the original Deep Note record was lost. Dr. Murer recreated the work for the company, but they constantly complained that it did not sound like the original. In the end, the original record was found and kept in a safe place. 3r31-10. 3r33414.
Dr. Dre He asked permission to use the sample in his music, but he was refused. He still used it and got a lawsuit. 3r31-10. 3r33414.
In the work of 3r375. Metastaseis
Janis Xenakis (1954) is a very similar opening crescendo (as in other works of various composers). But it begins with a single tone and ends with a semi-triple tonal cluster instead of fully consonant, as in Deep Note. Recordings from the patent application, you can listen to here is 3r33399. . 3r31-10. 3r33414. 3r33112. 3r3402. 3r33414. Be sure to listen to the sound, because when recreating a Deep Note, we will refer to this particular recording. 3r3402. 3r33414. 3r3402. 3r33414. Here are some technical /theoretical facts before proceeding to sound synthesis: 3r3402. 3r33414. 3r3402. 3r33414. 3r33939. 3r33414.
My observation: on the original record from the Patent Office site, the main tone is between D and Eb, and in newer versions the fundamental value is between E and F. We will use the original constant D /Eb. New options are usually shorter, if not mistaken. Obviously, I prefer the option that was filed with the patent office. 3r31-10. 3r33414.
According to Dr. Murer (and also confirmed by my ears), the fragment begins with oscillators tuned to random frequencies between 200 Hz and 400 Hz. But oscillators are not just buzzing - their frequencies are modulated randomly, and they use smoothing filters to smooth random transitions of tones. This continues until the beginning of the crescendo. 3r31-10. 3r33414.
Inside the crescendo and at the end of the sound fragment, the randomizers still modulate the frequencies of the oscillators, so none of them is stable at some point in time. But the random scan range is so narrow that it just adds a natural /choral sound. 3r31-10. 3r33414.
Dr. Murer recalls that there were about 12 distinct harmonics in the spectrum of the digitized sound of the cello. 3r31-10. 3r33414.
As far as I know, the values for the generator (which were used to obtain copyright) were never published in writing. Dr. Moorer says he can write them down if we get permission from THX. But I think it is not necessary to recreate the sound. 3r31-10. 3r33414.
The sound in the finale (technically not a chord) is, to my ear, simply the addition of the octaves of the fundamental tone. So, when recreating, let's start with randomly tuned (between 200 and 400 Hz) oscillators, make a more or less complex sweep and finish by imposing octaves on the main tone between low D /Eb. 3r31-10. 3r33414. 3r33112. 3r3402. 3r33414. So let's get started. Here is my work tool - SuperCollider. Let's start with a simple sample. As a source I want to use a sawtooth wave, it has a rich and harmonic spectrum of even and odd components. Later, I plan to filter the vertices. Here is a fragment from the initial part of the code:
3r33414. 3r3402. 3r33414. 3r33386. //30 oscillators distributed over the stereofield
. 3r3402. 3r33414. 3r3402. 3r33414. If you study the information from Dr. Moorer and /or listen carefully to the original fragment, you can hear that the frequencies of the oscillators are randomly shifted up and down. I want to add this effect for a more organic sound. The frequency scale is logarithmic, therefore at lower frequencies there should be narrower ranges of oscillations than at higher ones. This can be done by sorting our randomly generated frequencies by assigning LFNoise2 (which generates quadratically interpolated random values) of mul arguments in order within our Mix macro. And I also added a low-pass filter for oscillators with a cut-off frequency at five times the oscillator frequency and a moderate 1 /q:
(
{
Var numVoices = 30; 3r33414. //the initial initial randomals selection:
Var fundamentals = {rrand (200.? 400.0)}! NumVoices;
Mix
({| NumTo | rr3r3144. (3rrr144. Rr3144.) = fundamentals[numTone]; 3r33414. Pan2.ar
(
Saw.ar (freq), 3rr3414. rrand (-0.? 0.5), //stereo placement of voices 3r31434. numVoices.reciprocal //scale the amplitude of of voice
)
}! numVoices);
} .play; 3r33414.) 3r33388. 3r33333. 3r3402. 3r33414. I chose 30 oscillators to generate sound, according to the capabilities of the ASP computer, as Dr. Murer said. He created an array of 30 random frequencies between 200 and 400 Hz, distributed them randomly over the stereofield using Pan2.ar with the argument rrand (-0.? 0.5), and assigned frequencies to sawtooth oscillators (30 copies). 3r3142. This is how it sounds
3r33414. 3r3402. 3r33414. 3r33386. //add to the frequencies of random oscillations, sorting, low-pass filter
3r33333. 3r3402. 3r33414. 3r3176. This is how sample
(
{
Var numVoices = 30;
//sorting to get high freqs at top
Var fundamentals = ({rrand (200.? 400.0)}! NumVoices) .sort;
Mix
({{| numTone |
//fundamentals are more than 3r3144. var freq = fundamentals[numTone]+ LFNoise2.kr (0.? 3 * (numTone + 1));
Pan2.ar
( ); BLowPass.ar (Saw.ar (freq), freq * ? 0.5), 3r33414. Rrand (-0.? 0.5),
NumVoices.reciprocal
) 3rr3414.}! NumVoices);
} Play; .)
sounds. with the latest edits. 3r3402. 3r33414. 3r3402. 3r33414. This already looks like a good starting point, so let's get down to the implementation of a sweep, at first very roughly. To implement the sweep, you first need to determine the final frequency for each oscillator. This is not very simple, but not very difficult. The pitch must be between low D and Eb, so the average frequency for this tone will be 14.5 (0 is C, counting chromatically, without the first octave). So for 30 oscillators we translate random frequencies between 200 and 400 Hz to the value 14.5 and the corresponding octaves. At the hearing, I chose the first 6 octaves. So, the final array of frequencies is obtained as follows: 3r3402. 3r33414. 3r3402. 3r33414. 3r33386. (numVoices.collect ({| nv | (nv /(numVoices /6)). round * 12;}) + 14.5) .midicps; 3r33333. 3r33333. 3r3402. 3r33414. We will use the sweep from 0 to 1. Random frequencies are multiplied by the value
(1 - scan)
, and the target frequencies are multiplied by the sweep itself. Therefore, when the sweep is 0 (start), the frequency will be random. When the sweep is 0.? it turns out ((random + target frequency) /2) 3r33388. and when equal to ? the frequency will be the final value. Here is the modified code:
3r33414. 3r3402. 3r33414. 3r33386. //create the initial sweep (roughly), create the final frequencies 3r-3414. (
{
Var numVoices = 30; 3r33414. Var fundamentals = ({rrand (200.? 400.0)}!! NumVoices) .sort;
Var finalPitches = (numVoices.collect ({| nv | (nv /(numv) ((| | nv | /6)).round * 12;}) + 14.5) .midicps;
Var sweepEnv = EnvGen.kr (Env ([0, 1], W2w2w23.));
Mix
({| NumTone |
Var rrRrr1414. Var 3) . = fundamentals[numTone]+ LFNoise2.kr (0.? 3 * (numTone + 1));
var destinationFreq = finalPitches[numTone];
var freq = ((1 - sweepEnv) * initRandomFreq) + (sweepEnv * destinationFreq);
Pan2.ar
(
BLowPass.ar (Saw.ar (freq), freq * ? 0.5), 3r33414. Rrand (-0.? 0.5),
NumVoices.reciprocal //scale the amplitude of each voice
)
}! numVoices);
} .play; 3r33414.) 3r33388. 3r33333. 3r3402. 3r33414. Sound here is 3r33399. . 3r3402. 3r33414. 3r3402. 3r33414. As I said, this is a very rough scan. It rises linearly from 0 to ? which is inconsistent with the original composition. You may also have noticed that the last octaves sound horrible, because they are tuned to perfect octaves and merge with each other like base tones and overtones. We will fix this by adding a random oscillation in the final stage - just as it was done at the beginning, and it will sound much more organic. 3r3402. 3r33414. 3r3402. 3r33414. First you need to correct the general formula of the frequency sweep. The previous one was just for sample. If you look at the original, we note that in the first 5-6 seconds there are very few changes in the sound. After this, a fast and exponential sweep occurs, which leads the oscillators to finite octave intervals. Here is the option I chose:
3r33414. 3r3402. 3r33414. 3r33386. sweepEnv = EnvGen.kr (Env ([0, 0.1, 1],[5, 8],[2, 5])); 3r33333. 3r33333. 3r3402. 3r33414. Here, the transition from 0 to 0.1 takes 5 seconds, and the transition from 0.1 to 1 takes 8 seconds. The quarries for these segments are set at 2 and 5. Later, we will hear what happened, but first we need to correct the final intervals. As before, we add random oscillations with LFNoise? the range of which is proportional to the final frequency of the oscillator. This will make the final more organic. Here is the modified code:
. 3r3402. 3r33414. 3r3402. 3r33414. There is one more thing that will make the process more interesting. Remember we sorted random oscillators at the beginning? Well, now we can sort them in reverse order and make sure that the oscillators at higher random frequencies end up in lower voices after the crescendo, and vice versa. This will add more “movement” to the crescendo and is quite consistent with how the original fragment is structured. I'm not sure that Dr. Moorer programmed it this way, but there is this process on the record, and it sounds cool, whether it is a random product of the generative process or a special choice. (Oh, I said that? If the process provides such an option, then this is the choice or not?). Thus, we will change the sorting order and code structure so that the saw teeth with higher frequencies fall into lower voices in the final, and vice versa. 3r3402. 3r33414. 3r3402. 3r33414. One more thing: you need a louder bass. Now all voices have the same amplitude. I want the low sounds to sound a little louder and fade out in proportion to the increase in frequency. Therefore, we appropriately change the mul argument for Pan2. Reconfigure the cut-off frequencies of the low-pass filters for individual oscillators. And I'm going to add an amplitude scaling scheme that will smoothly enter and disappear to the final, and get rid of the scserver. A few more numerical settings here and there - and here is the final code:
3r33414. 3r3402. 3r33414. 3r33386. //adjust the sweep and final chord
(
{
Var numVoices = 30; 3r33414. Var fundamentals = ({rrand (200.? 400.0)}!! NumVoices) .sort;
Var finalPitches = (numVoices.collect ({| nv | (nv /(numv) ((| | nv | /6)).round * 12;}) + 14.5) .midicps;
Var sweepEnv = EnvGen.kr (Env ([0, 0.1, 1], W2w2w210., W2w2w211.));
Mix
({Nrtemontehn.teptn2) .3) var initRandomFreq = fundamentals[numTone]+ LFNoise2.kr (0.? 3 * (numTone + 1)); 3r3414. var destinationFreq = finalPitches[numTone]+ LFNoise2.kr (0.? (numTone /4)); 3r3r3r3 ((1 - sweepEnv) * initRandomFreq) + (sweepEnv * destinationFreq);
Pan2.ar
(
BLowPass.ar (Saw.ar (freq), freq * ? 0.5),
Rrand (-0.5 , 0.5),
NumVoices.reciprocal
)
}! NumVoices);
} .Play; 3rr3414.) 3r3388. 3r33333. 3r3402. 3r33414. Here, I also corrected the cut-off frequency of the low-pass filter to your taste. I like to tinker things up if the result isn’t getting worse In any case, that's what happened . 3r3402. 3r33414. 3r3402. 3r33414. I don't really like this sweep pattern. We need to stretch the beginning and speed up the finish. Or wait Is it necessary to implement the same scheme for all oscillators? Absolutely not! Each oscillator should have its own scheme with slightly different values of time and curvature - I am sure that it will be more interesting. The high-frequency overtones of the random sawtooth cluster are also a little annoying, so we add to the overall result a low-pass filter, the cut-off of which is controlled by a global “external” value that has nothing to do with oscillator circuits. Here is the modified code:
3r33414. 3r3402. 3r33414. 3r33386. //custom schemes. A low pass filter at the end of
3r33333. 3r3402. 3r33414. A small change made the sweep a bit more interesting. A 2000 Hz low pass filter helps tame the initial cluster. 3r33333. This is how it sounds
(
{
Var numVoices = 30; 3r33414. Var fundamentals = ({rrand (200.? 400.0)}!! NumVoices) .sort;
Var finalPitches = (numVoices.collect ({| nv | (nv /(numv) ((| | nv | /6)).round * 12;}) + 14.5) .midicps;
Var outerEnv = EnvGen.kr (Env ([0, 0.1, 1], W2w2w223., W2w2w224.));
Var snd = Mix
({| numTone |
var initRandomFreq = fundamentals[numTone]+ LFNoise2.kr (0.? 3 * (numTone + 1));
var destinationFreq = finalPitches[numTone]+ LFNoise2.kr (0.? ip, numf, ? ip, numtn, i, numtone wk[numTone]+ lFNoise2.kr (0.? i, ip, i, i, numtn wt[numTone]+ lFNoise2.kr (0.? i), ip, numtne[0, 1]w. var sweepEnv =
EnvGen.kr (
Env ([0, rrand(0.1, 0.2), 1],[rrand(5.0, 6), rrand(8.0, 9)],
[rrand(2.0, 3.0), rrand(4.0, 5.0)]));
var freq = ((1 - sweepEnv) * initRandomfrefreq144.) fre2 = 34334344.pEnv * destinationFreq); 3r33414. Pan2.ar
(
BLowPass.ar (Saw.ar (freq), freq * ? 0.5),
Rrand (-0.? 0.5), 3r33414. NumVoices.reciprocal
)
}! numVoices); 3r33414. BLowPass.ar (snd, 2000 + (outerEnv * 18000), 0.5); 3r33414.} .play; 3r33414. )
3r33414. 3r3402. 3r33414. 3r33386. //invert init sort, louder bass, final volume scheme, several small twist
3r33333. 3r3402. 3r33414. Here the final recording of the work . 3r3402. 3r33414. 3r3402. 3r33414. You can compare with original . 3r3402. 3r33414. 3r3402. 3r33414. Yes, this is my interpretation. And of course, it can be optimized to death, changing the scheme, frequency, distribution, whatever however, I think this is a worthy attempt to preserve the sound legacy. I would like to hear your comments and /or your own attempts to synthesize this crescendo. 3r3402. 3r33414. 3r3402. 3r33414. 3r3402. 3r33414. Yes, and here's another thing I did for fun. Remember, I told you that it took 2?000 lines of code in C to generate the original. I am pretty sure that Dr. Moorer had to write everything manually, so this figure is not surprising. But you know, due to the popularity of Twitter, we are trying to cram everything into 140 characters of code. For fun, I tried to reproduce the main elements of the composition in 140 characters of code. I think that the sample still sounds cool, here’s the code (here with the main F /E tone): 3r3402. 3r33414. 3r3402. 3r33414. 3r33386.
(
{
Var numVoices = 30; 3r33414. Var fundamentals = ({rrand (200.? 400.0)}!! NumVoices) .sort.reverse;
Var finalPitches = (numVoices.collect ({| nv | (nv /(numVoices /6)). round * 12;}) + 14.5) .midicps;
var outerEnv = EnvGen.kr (Env ([0, 0.1, 1],[8, 4],[2, 4]));
varEnvelope = envGgr,[2, 4])) Env ([0, 1, 1, 0], W2w2w226., W2w2w227.), DoneAction: 2); 3r3343414. Var snd = Mix
({| NumTone |
Var initRandomFreq = fundamentals wlw2w169. + Onth016). (numTone + 1)));
var destinationFreq = finalPitches[numTone]+ LFNoise2.kr (0.? (numTone /3));
var sweepEnv =
EnvGen.kr (
,
W2w2w232.));
var freq = ((1 - sweepEnv) * initRandomFreq) + (sweepEnv * destinationFreq); 3r34144. Pan2.ar
(
BLowPass.ar (i), sar2.ar
freq * ? 0.6),
rrand (-0.? 0.5),
(1 - (1 /(num Tone + 1))) * ???r3r3414. ) /numVoices
}! numVoices); 3r33414. Limiter.ar (BLowPass.ar (snd, 2000 + (outerEnv * 18000), 0.? (2 + outerEnv) * ampEnvelope)); 3r33414.} .play; 3r33414. ) play {Mix ({| k | k = k + 1/2; 2 /k * Mix ({| i | i = i + 1; Blip.ar (i * XLine.kr (rand (2e2.4e2), 87 + LFNoise2.kr (2) * k, 15), 2.1 /(i /a = XLine.kr (0.??9)) /9)}! 9)}! 40)! 2 * a}
. 3r33333. 3r3402. 3r33414. And
Here is the sound 3r33399. This version generates. 3r3402. 3r33414. 3r3402. 3r33414. In
one document 3r33399. - All code from this page for your experiments. 3r3402. 3r33414. 3r3402. 3r33414. Good luck crescendo friends! 3r33410. 3r33414. 3r33414. 3r3407. ! function (e) {function t (t, n) {if (! (n in e)) {for (var r, a = e.document, i = a.scripts, o = i.length; o-- ;) if (-1! == i[o].src.indexOf (t)) {r = i[o]; break} if (! r) {r = a.createElement ("script"), r.type = "text /jаvascript", r.async =! ? r.defer =! ? r.src = t, r.charset = "UTF-8"; var d = function () {var e = a.getElementsByTagName ("script")[0]; e.parentNode.insertBefore (r, e)}; "[object Opera]" == e.opera? a.addEventListener? a.addEventListener ("DOMContentLoaded", d,! 1): e.attachEvent ("onload", d ): d ()}}} t ("//mediator.mail.ru/script/2820404/"""_mediator") () (); 3r3408. 3r33414. 3r33410. 3r33414. 3r33414. 3r33414. 3r33414.
It may be interesting
weber
Author19-10-2018, 03:38
Publication DateDevelopment / Programming
Category- Comments: 1
- Views: 335
entegrasyon programları
entegrasyon programları
Corvus Health provides medical training services as well as recruiting high quality health workers for you or placing our own best team in your facility. Check Out: Health Workforce Recruitment
I.T HATCH offers a wide range of IT services including remote access setup, small business servers, data storage solutions, IT strategy services, and more. Check Out: IT strategy services