.. include:: /project-links.txt .. include:: /abbreviation.txt .. getthecode:: twelve-tone-equal-temperament.py :language: python =============================== Twelve-Tone Equal Temperament =============================== This section illustrates the twelve-tone equal temperament (12-TET). .. code-block:: python import numpy import matplotlib.pyplot as plt from Musica.Math.MusicTheory import * from Musica.Theory.Temperament import * fifth_approximations = ET12Tuning.fifth_approximations(number_of_steps_max=20) print('Perfect fifth 3/2\n 1.5 {:.1f} cent'.format( float(Cent.from_frequency_ratio(FrequencyRatio.fifth)))) for pitch in fifth_approximations: print('2**{:2}/{:2} {:.4f} {:.1f} cent'.format( pitch.number_of_steps, pitch.step_number, float(pitch), float(pitch.cent), )) .. literalinclude:: twelve-tone-equal-temperament.stdout :lines: 1-5 .. code-block:: python number_of_octaves = 10 octave_frequencies = [[ET12.frequency(octave_number, interval_number) for interval_number in range(1, 13)] for octave_number in range(1, number_of_octaves +1)] all_frequencies = [] for octave_number in range(1, number_of_octaves +1): frequencies = octave_frequencies[octave_number -1] all_frequencies += frequencies print("Octave {:2} {}".format(octave_number, ['{:.2f}'.format(x) for x in frequencies])) .. literalinclude:: twelve-tone-equal-temperament.stdout :lines: 8-17 .. code-block:: python figure = plt.figure(1, (20, 10)) axe = plt.subplot(111) axe.set_title('Twelve-tone Equal Temperament') axe.set_xlabel('notes') axe.set_ylabel('Hz') axe.grid() for octave_number in range(number_of_octaves): x = octave_number * 12 + 1 axe.axvline(x, color='blue') axe.text(x, 10, 'Octave {}'.format(octave_number +1), color='black') axe.semilogy(range(1, len(all_frequencies) +1), all_frequencies, 'o-') axe.axhline(y=440, color='red') axe.text(2, 460, 'A 440 Hz', color='black') axe.axhline(y=50, color='red') axe.axhline(y=60, color='red') axe.text(20, 65, 'Electric Network Frequency 50/60Hz', color='black') axe.axhline(y=20e3, color='red') axe.text(2, 22e3, 'Human Ear Limit 20 kHz', color='black') plt.show() .. image:: 12tet.png :align: center