Source code for GLXCurses.Buzzer

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# It script it publish under GNU GENERAL PUBLIC LICENSE
# http://www.gnu.org/licenses/gpl-3.0.en.html
# Author: the Galaxie Curses Team, all rights reserved

# http://www.tonalsoft.com/pub/news/pitch-bend.aspx
# http://musicmasterworks.com/WhereMathMeetsMusic.html
# http://www.tonalsoft.com/enc/number/12edo.aspx

try:
    # noinspection PyUnresolvedReferences
    import winsound

    def play_sound(frequency, duration):
        winsound.Beep(frequency, duration)


except ImportError:
    import os

[docs] def play_sound(frequency, duration): """ Play a sound via the Buzzer of the computer :param frequency: frequency in Hertz (HZ) of the note to play :type frequency: int :param duration: how many time we play the note in Millisecond (ms) :type duration: int """ # apt-get install beep os.system("beep -f %s -l %s" % (frequency, duration))
[docs]class Buzzer(object): """ :Description: The famous buzzer class, why not implement a wireless protocol with the buzzer ? .. py:attribute:: tempo Beats per minute (bpm) is a unit typically used as a measure of tempo :Type: :py:__area_data:`float` :Flags: Read / Write :Default value: 110.0 """ def __init__(self): # self.tempo = 110.0 # Set Notes self.midi_notes = list() # Octave -5 # Midi Octave, Midi Note Number, Note Name, Frequency Hz, Absolute Cents self.midi_notes.append([-5, 0, "C", 8.1757989156, -6.9000000]) self.midi_notes.append([-5, 1, "C#/Db", 8.6619572180, -6.9000000]) self.midi_notes.append([-5, 2, "D", 9.1770239974, -6.9000000]) self.midi_notes.append([-5, 3, "D#/Eb", 9.7227182413, -6.9000000]) self.midi_notes.append([-5, 4, "E", 10.3008611535, -6.9000000]) self.midi_notes.append([-5, 5, "F", 10.9133822323, -6.9000000]) self.midi_notes.append([-5, 6, "F#/Gb", 11.5623257097, -6.9000000]) self.midi_notes.append([-5, 7, "G", 12.2498573744, -6.9000000]) self.midi_notes.append([-5, 8, "G#/Ab", 12.9782717994, -6.9000000]) self.midi_notes.append([-5, 9, "A", 13.7500000000, -6.9000000]) self.midi_notes.append([-5, 10, "A#/Bb", 14.5676175474, -5.9000000]) self.midi_notes.append([-5, 11, "B", 15.4338531643, -5.8000000]) # Octave -4 # Midi Octave, Midi Note Number, Note Name, Frequency Hz, Absolute Cents self.midi_notes.append([-4, 12, "C", 16.3515978313, -5.700]) self.midi_notes.append([-4, 13, "C#/Db", 17.3239144361, -5.600]) self.midi_notes.append([-4, 14, "D", 18.3540479948, -5.500]) self.midi_notes.append([-4, 15, "D#/Eb", 19.4454364826, -6.9000000]) self.midi_notes.append([-4, 16, "E", 20.6017223071, -6.9000000]) self.midi_notes.append([-4, 17, "F", 21.8267644646, -6.9000000]) self.midi_notes.append([-4, 18, "F#/Gb", 23.1246514195, -6.9000000]) self.midi_notes.append([-4, 19, "G", 24.4997147489, -6.9000000]) self.midi_notes.append([-4, 20, "G#/Ab", 25.9565435987, -6.9000000]) self.midi_notes.append([-4, 21, "A", 27.5000000000, -6.9000000]) self.midi_notes.append([-4, 22, "A#/Bb", 29.1352350949, -5.9000000]) self.midi_notes.append([-4, 23, "B", 30.8677063285, -5.8000000]) # Octave -3 # Midi Octave, Midi Note Number, Note Name, Frequency Hz, Absolute Cents self.midi_notes.append([-3, 24, "C", 32.7031956626, -5.700]) self.midi_notes.append([-3, 25, "C#/Db", 34.6478288721, -5.600]) self.midi_notes.append([-3, 26, "D", 36.7080959897, -5.500]) self.midi_notes.append([-3, 27, "D#/Eb", 38.8908729653, -6.9000000]) self.midi_notes.append([-3, 28, "E", 41.2034446141, -6.9000000]) self.midi_notes.append([-3, 29, "F", 43.6535289291, -6.9000000]) self.midi_notes.append([-3, 30, "F#/Gb", 46.2493028390, -6.9000000]) self.midi_notes.append([-3, 31, "G", 48.9994294977, -6.9000000]) self.midi_notes.append([-3, 32, "G#/Ab", 51.9130871975, -6.9000000]) self.midi_notes.append([-3, 33, "A", 55.0000000000, -6.9000000]) self.midi_notes.append([-3, 34, "A#/Bb", 58.2704701898, -5.9000000]) self.midi_notes.append([-3, 35, "B", 61.7354126570, -5.8000000]) # Octave -2 # Midi Octave, Midi Note Number, Note Name, Frequency Hz, Absolute Cents self.midi_notes.append([-2, 36, "C", 65.4063913251, -5.700]) self.midi_notes.append([-2, 37, "C#/Db", 69.2956577442, -5.600]) self.midi_notes.append([-2, 38, "D", 73.4161919794, -5.500]) self.midi_notes.append([-2, 39, "D#/Eb", 77.7817459305, -6.9000000]) self.midi_notes.append([-2, 40, "E", 82.4068892282, -6.9000000]) self.midi_notes.append([-2, 41, "F", 87.3070578583, -6.9000000]) self.midi_notes.append([-2, 42, "F#/Gb", 92.4986056779, -6.9000000]) self.midi_notes.append([-2, 43, "G", 97.9988589954, -6.9000000]) self.midi_notes.append([-2, 44, "G#/Ab", 103.8261743950, -6.9000000]) self.midi_notes.append([-2, 45, "A", 110.0000000000, -6.9000000]) self.midi_notes.append([-2, 46, "A#/Bb", 116.5409403795, -5.9000000]) self.midi_notes.append([-2, 47, "B", 123.4708253140, -5.8000000]) # Octave -1 # Midi Octave, Midi Note Number, Note Name, Frequency Hz, Absolute Cents self.midi_notes.append([-1, 48, "C", 130.8127826503, -5.700]) self.midi_notes.append([-1, 49, "C#/Db", 138.5913154884, -5.600]) self.midi_notes.append([-1, 50, "D", 146.8323839587, -5.500]) self.midi_notes.append([-1, 51, "D#/Eb", 155.5634918610, -6.9000000]) self.midi_notes.append([-1, 52, "E", 164.8137784564, -6.9000000]) self.midi_notes.append([-1, 53, "F", 174.6141157165, -6.9000000]) self.midi_notes.append([-1, 54, "F#/Gb", 184.9972113558, -6.9000000]) self.midi_notes.append([-1, 55, "G", 195.9977179909, -6.9000000]) self.midi_notes.append([-1, 56, "G#/Ab", 207.6523487900, -6.9000000]) self.midi_notes.append([-1, 57, "A", 220.0000000000, -6.9000000]) self.midi_notes.append([-1, 58, "A#/Bb", 233.0818807590, -5.9000000]) self.midi_notes.append([-1, 59, "B", 246.9416506281, -5.8000000]) # Octave 0 # Midi Octave, Midi Note Number, Note Name, Frequency Hz, Absolute Cents self.midi_notes.append([0, 60, "C", 261.6255653006, -5.700]) self.midi_notes.append([0, 61, "C#/Db", 277.1826309769, -5.600]) self.midi_notes.append([0, 62, "D", 293.6647679174, -5.500]) self.midi_notes.append([0, 63, "D#/Eb", 311.1269837221, -6.9000000]) self.midi_notes.append([0, 64, "E", 329.6275569129, -6.9000000]) self.midi_notes.append([0, 65, "F", 349.2282314330, -6.9000000]) self.midi_notes.append([0, 66, "F#/Gb", 369.9944227116, -6.9000000]) self.midi_notes.append([0, 67, "G", 391.9954359817, -6.9000000]) self.midi_notes.append([0, 68, "G#/Ab", 415.3046975799, -6.9000000]) self.midi_notes.append([0, 69, "A", 440.0000000000, -6.9000000]) self.midi_notes.append([0, 70, "A#/Bb", 466.1637615181, -5.9000000]) self.midi_notes.append([0, 71, "B", 493.8833012561, -5.8000000]) # Octave 1 # Midi Octave, Midi Note Number, Note Name, Frequency Hz, Absolute Cents self.midi_notes.append([1, 72, "C", 523.2511306012, -5.700]) self.midi_notes.append([1, 73, "C#/Db", 554.3652619537, -5.600]) self.midi_notes.append([1, 74, "D", 587.3295358348, -5.500]) self.midi_notes.append([1, 75, "D#/Eb", 622.2539674442, -6.9000000]) self.midi_notes.append([1, 76, "E", 659.2551138257, -6.9000000]) self.midi_notes.append([1, 77, "F", 698.4564628660, -6.9000000]) self.midi_notes.append([1, 78, "F#/Gb", 739.9888454233, -6.9000000]) self.midi_notes.append([1, 79, "G", 783.9908719635, -6.9000000]) self.midi_notes.append([1, 80, "G#/Ab", 830.6093951599, -6.9000000]) self.midi_notes.append([1, 81, "A", 880.0000000000, -6.9000000]) self.midi_notes.append([1, 82, "A#/Bb", 932.3275230362, -5.9000000]) self.midi_notes.append([1, 83, "B", 987.7666025122, -5.8000000]) # Octave 2 # Midi Octave, Midi Note Number, Note Name, Frequency Hz, Absolute Cents self.midi_notes.append([2, 84, "C", 1046.5022612024, -5.700]) self.midi_notes.append([2, 85, "C#/Db", 1108.7305239075, -5.600]) self.midi_notes.append([2, 86, "D", 1174.6590716696, -5.500]) self.midi_notes.append([2, 87, "D#/Eb", 1244.5079348883, -6.9000000]) self.midi_notes.append([2, 88, "E", 1318.5102276515, -6.9000000]) self.midi_notes.append([2, 89, "F", 1396.9129257320, -6.9000000]) self.midi_notes.append([2, 90, "F#/Gb", 1479.9776908465, -6.9000000]) self.midi_notes.append([2, 91, "G", 1567.9817439270, -6.9000000]) self.midi_notes.append([2, 92, "G#/Ab", 1661.2187903198, -6.9000000]) self.midi_notes.append([2, 93, "A", 1760.0000000000, -6.9000000]) self.midi_notes.append([2, 94, "A#/Bb", 1864.6550460724, -5.9000000]) self.midi_notes.append([2, 95, "B", 1975.5332050245, -5.8000000]) # Octave 3 # Midi Octave, Midi Note Number, Note Name, Frequency Hz, Absolute Cents self.midi_notes.append([3, 96, "C", 2093.0045224048, -5.700]) self.midi_notes.append([3, 97, "C#/Db", 2217.4610478150, -5.600]) self.midi_notes.append([3, 98, "D", 2349.3181433393, -5.500]) self.midi_notes.append([3, 99, "D#/Eb", 2489.0158697766, -6.9000000]) self.midi_notes.append([3, 100, "E", 2637.02045530305, -6.9000000]) self.midi_notes.append([3, 101, "F", 2793.8258514640, -6.9000000]) self.midi_notes.append([3, 102, "F#/Gb", 2959.9553816931, -6.9000000]) self.midi_notes.append([3, 103, "G", 3135.9634878540, -6.9000000]) self.midi_notes.append([3, 104, "G#/Ab", 3322.4375806396, -6.9000000]) self.midi_notes.append([3, 105, "A", 3520.0000000000, -6.9000000]) self.midi_notes.append([3, 106, "A#/Bb", 3729.3100921447, -5.9000000]) self.midi_notes.append([3, 107, "B", 3951.0664100490, -5.8000000]) # Octave 4 # Midi Octave, Midi Note Number, Note Name, Frequency Hz, Absolute Cents self.midi_notes.append([4, 108, "C", 4186.0090448096, -5.700]) self.midi_notes.append([4, 109, "C#/Db", 4434.9220956300, -5.600]) self.midi_notes.append([4, 110, "D", 4698.6362866785, -5.500]) self.midi_notes.append([4, 111, "D#/Eb", 4978.0317395533, -6.9000000]) self.midi_notes.append([4, 112, "E", 5274.0409106059, -6.9000000]) self.midi_notes.append([4, 113, "F", 5587.6517029281, -6.9000000]) self.midi_notes.append([4, 114, "F#/Gb", 5919.9107633862, -6.9000000]) self.midi_notes.append([4, 115, "G", 6271.92697571, -6.9000000]) self.midi_notes.append([4, 116, "G#/Ab", 6644.8751612791, -6.9000000]) self.midi_notes.append([4, 117, "A", 7040.0000000000, -6.9000000]) self.midi_notes.append([4, 118, "A#/Bb", 7458.6201842894, -5.9000000]) self.midi_notes.append([4, 119, "B", 7902.1328200980, -5.8000000]) # Octave 5 # Midi Octave, Midi Note Number, Note Name, Frequency Hz, Absolute Cents self.midi_notes.append([5, 120, "C", 8372.0180896192, -5.700]) self.midi_notes.append([5, 121, "C#/Db", 8869.8441912599, -5.600]) self.midi_notes.append([5, 122, "D", 9397.2725733570, -5.500]) self.midi_notes.append([5, 123, "D#/Eb", 9956.0634791066, -6.9000000]) self.midi_notes.append([5, 124, "E", 10548.0818212118, -6.9000000]) self.midi_notes.append([5, 125, "F", 11175.3034058561, -6.9000000]) self.midi_notes.append([5, 126, "F#/Gb", 11839.8215267723, -6.9000000]) self.midi_notes.append([5, 127, "G", 12543.8539514160, -6.9000000])
[docs] def get_tempo(self): """ Get the tempo attribute :return: tempo attribute value is in BPM :rtype: float """ return float(self.tempo)
[docs] def set_tempo(self, tempo=110.0): """ Set the tempo attribute :param tempo: tempo value in BPM :type tempo: float """ self.tempo = float(tempo)
[docs] def get_tempo_to_ms(self): """ Get actual tempo value in Millisecond (ms) :return: tempo value in ms :rtype: int """ return int(60000 / self.get_tempo())
[docs] def get_croche(self): """ Get the **Croche** it consist to devise the tempo by 2 :return: tempo value div by 2 in Millisecond (ms) :rtype: int """ return int(self.get_tempo_to_ms() / 2)
[docs] def get_double_croche(self): """ Get the **Double Croche** it consist to devise the tempo by 4 :return: tempo value div by 4 in Millisecond (ms) :rtype: int """ return int(self.get_tempo_to_ms() / 4)
[docs] def get_triple_croche(self): """ Get the **Triple Croche** it consist to devise the tempo by 8 :return: tempo value div by 8 in Millisecond (ms) :rtype: int """ return self.get_tempo_to_ms() / 8
[docs] def get_blanche(self): """ Get the **Blanche** it consist to multiply the tempo by 2 :return: tempo value div by 2 in Millisecond (ms) :rtype: int """ return int(self.get_tempo_to_ms() * 2)
[docs] def get_triolet(self): """ Get the **Triolet** it consist to multiply the tempo by 3 :return: tempo value div by 3 in Millisecond (ms) :rtype: int """ return int(self.get_tempo_to_ms() / 3)
[docs] def get_notes(self): """ Get MIDI notes list , each item contain a list as container **Notes Structure:** list(Octave, Midi_Note_Number, Note_Name, Frequency_Hz, Absolute_Cents) .. code: python self.midi_notes = list() self.midi_notes.append([1, 72, 'C', 523.2511306012, -5.700]) :return: the entry midi note list :rtype: list(list(),list(),list()) """ return self.midi_notes
[docs] @staticmethod def get_ms_to_tempo(ms): """ Get the conversion of a ms value to a tempo value :param ms: tempo value in Millisecond (ms) :type ms: int :return: 60000 divided by Millisecond (ms) value :rtype: float """ return float(60000 / ms)
[docs] def get_tempo_to_hertz(self): """ Get the conversion of the tempo in BPM to the frequency in Hz :return: tempo divided by 60 :rtype: int """ return int(self.get_tempo() / 60)
[docs] @staticmethod def get_hertz_to_ms(hz): """ Get the conversion of a **Hz** value to a **ms** value :param hz: frequency in Hertz (**Hz**) :type hz: int :return: the duration of the period frequency in ms (**ms**) :rtype: int """ return int((1 / hz) * 1000)
if __name__ == "__main__": buzzer = Buzzer() buzzer.set_tempo(110) for i in range(100): for note in buzzer.get_notes(): if note[3] > 50: line = "" line += "Midi Note:" line += " " line += str(note[1]) print(line) play_sound(int(note[3]), buzzer.get_triple_croche()) for note in reversed(buzzer.get_notes()): if note[3] > 50: line = "" line += "Midi Note:" line += " " line += str(note[1]) print(line) play_sound(int(note[3]), buzzer.get_triple_croche())