This SC file includes three preliminary applications of the perfect frequencies that have been discovered. If you are viewing this file with a plain text editor, then you would need a free program called SuperCollider in order to run it. These ideas are available to anyone for free and open use. You can expand upon them or implement them in anyway you would like. The standard system of equal temperament tuning is inherently flawed, and so is almost every alternative to the standard. Many of the sonic relationships that are formed by playing chords in these imperfect tunings can be visually proven to create discordant wave-shapes. The equal temperament tuning is not capable of producing any truly harmonious chords unless only the octave notes are played together, with or without the root note. The perfect frequencies, however, will create fascinating geometric patterns when played in any combination. If one of the frequencies is off by only a fraction of a percent, then the wave-form will visually reveal it's dissonance when viewed by an x/y oscilloscope, which is demonstrated here and begins on line 140. The first function within this file will calculate the corresponding MIDI pitch number for each whole integer frequency in the new tuning. The perfect frequencies can be seen in the first array of the first function. The second function, starting on line 140, is the visualization script that was used find these numbers. It is already programmed with 19 separate chords from the perfect frequency series. Included are some of the shapes and formations that really highlight the beauty of this new tuning system. The third function, which starts on line 236, is a script that allows anyone with an Ableton Push controller to play these perfect notes without the necessity of using interpolated MIDI data. This guarantees that only pure tones will be produced at runtime, because the unaltered MIDI note numbers will be used to trigger the different frequency arguments for the same digital instrument, which in this case is a pulse generator. If you have a different MIDI controller, then only minor modifications will need to be made to accommodate your device. Here is the first function : ( n = 0; // the MIDI note number f = 0; // the index number used to extract the corresponding integer from the following array : // the perfect frequencies : x = [ 54, 60, 66, 72, 81, 90, 96, 102, 108, 128, 132, 144, 162, 180, 192, 204, 216, 240, 264, 288, 324, 360, 384, 408, 432, 480, 528, 576, 648, 720, 768, 816, 864, 960, 1056, 1152, 1296, 1440, 1536, 1632, 1728, 1920, 2112, 2304, 2592, 2880, 3072, 3264, 3456, 3840, 4224, 4608, 5184, 5760, 6144, 6528, 6912, 7680, 8448, 9216, 10368, 11520, 12288, 528 ]; while ( {n < 64}, { var freq = x[f], y, z; post ( "{nn ==" ++ n. value ++ "}" ++ "{" ++ x[f] ++ "}" ); y = freq. cpsmidi ; z = y. midicps . round ( 0.001 ); inf orm ( "

" + "frequency =" + ( freq ) + "

" + "MIDI# = " + y + "

" + "MIDI# converted to Hz, then rounded by 0.001 = " + z + "





" ); n = n + 1; // these numbers are separate so n can be set to a higher number // in case your MIDI controller starts at a number higher than 0 f = f + 1; /* * The series ends at 12288 because the next number in the series * would be too large for standard MIDI pitch data to process. * You may decide to begin the series at a lower frequency * than 54 to avoid this problem... or you could keep an arbitrary * variable at the end, as shown in the example. * You can calculate the ratios by dividing the numbers in the root scale, * which starts at 432 and forms an octave at 864. * The rest of the numbers were originally calculated by dividing or * multiplying the whole numbers in the root scale by 2, 4, 8, and 16. * The conversion of MIDI integers into floats is only a partial solution. * Future instruments would have to be built from the ground up * with an emphasis on this set of numbers in order to gain * the highest sonic effect... and there is much more that can be done with them! * */ } ) // end of while loop ) // end of the first function For visualizing note combinations : Server. killAll ; s. reboot ; ( Server. default = Server. internal ; // start the program : Server. default . waitForBoot ({ // this may take awhile... // if your internal server doesn't boot, or if there's no sound, then try // running lines 137 and 138 separately before running this script again // create phase scope : var phaseScope; // allocate audio buffer : var bufferA = Buffer. alloc ( Server. default , 8192,2 ); // create a signal through a resonant filter : var sound = { // Arguments of Resonz. ar function : // Resonz. ar ( input_signal, resonant_frequency ) var signal = Resonz. ar ( // the 2nd Array in the argument list is the resonant frequency... // ... which alters the size but not the shape of the pattern. // keep one line uncommented to run : [(SinOsc. ar (432) + SinOsc. ar (528)), SinOsc. ar (528)], [12288] // [(LFTri. ar (432) + LFTri. ar (528)), LFTri. ar (528)], [12288] // [(LFTri. ar (432) + SinOsc. ar (528)), LFTri. ar (528)], [12288] // [(SinOsc. ar (432) + SinOsc. ar (528)), SinOsc. ar (528*2)], [12288] // [(SinOsc. ar (324*4) + Saw. ar (648/2)), Pulse. ar (1296)], [12288] // [(SinOsc. ar (324*2) + SinOsc. ar (648*8)), Saw. ar (1296*2)], [12288] // [(SinOsc. ar (324*2) + SinOsc. ar (648*16)), SinOsc. ar (1296*8)], [12288] // [(SinOsc. ar (480) + LFTri. ar (1920)), SinOsc. ar (2112)], [12288] // [(SinOsc. ar (480) + SinOsc. ar (1920/2)), SinOsc. ar (2112)], [12288] // [(SinOsc. ar (480/2) + SinOsc. ar (1920/2)), SinOsc. ar (2112)], [12288] // [(SinOsc. ar (108*16) + SinOsc. ar (108*8)), SinOsc. ar (108*4)], [12288] // [(SinOsc. ar (3456) + SinOsc. ar (360)), SinOsc. ar (1440)], [12288] // [(SinOsc. ar (144) + SinOsc. ar (1152)), SinOsc. ar (1296)], [12288] // [(SinOsc. ar (1728) + SinOsc. ar (2880)), Saw. ar (960)], [12288] //change the numbers slightly, and the visualizer will clearly show the changes : // difference of 1 cycle per second : // [(SinOsc. ar (1728) + SinOsc. ar (960)), SinOsc. ar (3072)], [12288] // [(SinOsc. ar (1728) + SinOsc. ar (960)), SinOsc. ar (3073)], [12288] // sometimes interesting effects can be achieved : // [(SinOsc. ar (1728) + SinOsc. ar (960)), SinOsc. ar (3072.2)], [12288] // difference of 0.01 cycles per second : // [(SinOsc. ar (432) + SinOsc. ar (528)), SinOsc. ar (432)], [12288] // [(SinOsc. ar (432) + SinOsc. ar (528)), SinOsc. ar (432.01)], [12288] ); //the signal function ends, and the next 3 lines complete the outer sound function : ScopeOut. ar ( signal, bufferA ); Out. ar ( 0,signal ); // write to output }. play ; // end of var sound var main_window = Window( "X/Y Oscilloscope", 640@320 ). front . onClose_ ( { // on close stop sound and free buffers sound. free ; bufferA. free ; } ); phaseScope = ScopeView(main_window,640@320). bufnum_ (bufferA. bufnum ); phaseScope. style_ (2) // Lissajous curves.....x/y mode . waveColors_ ([Color. magenta , Color. white ]). background_ (Color. black ) . xZoom_ (4). yZoom_ (2.25); // scaling factors for x/y zoom }) ) For using an Ableton Push controller to play the perfect frequencies : MIDIClient. init ; // I have found it's always better to run these two lines separately MIDIIn. connectAll ; ( MIDIdef. noteOn (

oteOnTest, { arg vel, nn; // velocity, note number { var sig, env, freq; freq = case // initialize case statement {nn == 0} {432} // top left knob {nn == 1} {480} {nn == 2} {528} {nn == 3} {576} {nn == 4} {648} {nn == 5} {720} {nn == 6} {768} {nn == 7} {816} {nn == 8} {864} // master volume knobs {nn == 9} {2112} // knob above slider, next to tempo {nn == 10} {1920} // tempo knob {nn == 11} {777} // there must be a hidden button somewhere... {nn == 12} {12288} // slider // MIDI #'s 13-35 are UNMAPPED {nn == 36} {54} {nn == 37} {60} {nn == 38} {66} {nn == 39} {72} {nn == 40} {81} {nn == 41} {90} {nn == 42} {96} {nn == 43} {102} {nn == 44} {108} {nn == 45} {128} {nn == 46} {132} {nn == 47} {144} {nn == 48} {162} {nn == 49} {180} {nn == 50} {192} {nn == 51} {204} {nn == 52} {216} {nn == 53} {240} {nn == 54} {264} {nn == 55} {288} {nn == 56} {324} {nn == 57} {360} {nn == 58} {384} {nn == 59} {408} {nn == 60} {432} {nn == 61} {480} {nn == 62} {528} {nn == 63} {576} {nn == 64} {648} {nn == 65} {720} {nn == 66} {768} {nn == 67} {816} {nn == 68} {864} {nn == 69} {960} {nn == 70} {1056} {nn == 71} {1152} {nn == 72} {1296} {nn == 73} {1440} {nn == 74} {1536} {nn == 75} {1632} {nn == 76} {1728} {nn == 77} {1920} {nn == 78} {2112} {nn == 79} {2304} {nn == 80} {2592} {nn == 81} {2880} {nn == 82} {3072} {nn == 83} {3264} {nn == 84} {3456} {nn == 85} {3840} {nn == 86} {4224} {nn == 87} {4608} {nn == 88} {5184} {nn == 89} {5760} {nn == 90} {6144} {nn == 91} {6528} {nn == 92} {6912} {nn == 93} {7680} {nn == 94} {8448} {nn == 95} {9216} {nn == 96} {10368} {nn == 97} {11520} {nn == 98} {12288} {nn == 99} {528}; // MIDI numbers stop here, end of case statement // action performed by noteon message : sig = Pulse. ar ( freq ); nn. postln ; freq. postln ; env = EnvGen. kr ( Env. perc , doneAction :2 ); ( sig * env ) !2 ; // stereo output }. play ; // if you skip the seventh note from any root note, // then you will hear a perfect do-re-me series } ) ) // if Push doesn't work with Live afterwards, then all you have to do // is restart the MIDI driver from within your operating system /// to be continued