2.11 J. S. Bach C-Dur Prelude ============================= In this Example I'm using the Chord of the C-Dur Prelude, BWV 846 .. code:: python3 from pyknon.genmidi import Midi from pyknon.music import Rest, Note, NoteSeq from music_generation import * import numpy as np import matplotlib.pyplot as plt Chord definitions ~~~~~~~~~~~~~~~~~ .. code:: python3 C = np.array([ 0, 4, 7]) Cm = np.array([ 0, 3, 7]) Cdim = np.array([ 0, 3, 6]) CM7 = np.array([ 0, 4, 7, 11]) C7 = np.array([ 0, 4, 7, 10]) Cm7 = np.array([ 0, 3, 7, 10]) Cdim7 = np.array([ 0, 3, 6, 10]) Cdim6 = np.array([ 0, 3, 6, 9 ]) C6 = np.array([ 0, 4, 7, 9 ]) # inversion of Am7 Cm6 = np.array([ 0, 3, 7, 9 ]) Csus4 = np.array([ 0, 5, 7]) Csus2 = np.array([ 0, 2, 7]) Csus47= np.array([ 0, 5, 7, 10]) P = np.array([ 0,7]) # Power chord (Perfect unison, Perfect fifth) B = np.array([ 0]) # Bass (Perfect unison) major = np.array([ 0, 2, 4, 5, 7, 9, 11]) minor = np.array([ 0, 2, 3, 5, 7, 8, 10]) blues = np.array([ 0, 3, 5, 6, 7, 10]) tune\_211\_A ------------ For this tune I use the chord sequence of a famous classical piece. **J. S. Bach C-Dur Prelude, Wohltemperirtes Klavier, BWV 846** - Three Strings playing chords - an acoustic bass - Organ for the second base - A Flute as solo voice .. code:: python3 def tune_211_A(): tune_name = 'tune_211_A' np.random.seed(54 ) # 79 33 bar, bpb = 36, 4 # bar: Takt , bpb: beat per bar melody_len = bar * bpb end_dur = 1.5 scales = [[1,'C',C],[1,'D',Cm7],[1,'G',C7],[1,'C',C],[1,'A',Cm],[1,'D',C7],[1,'G',C],[1,'C',CM7],[1,'C',C6],[1,'D',C7], [1,'G',C],[1,'G',Cdim6],[1,'D',Cm],[1,'F',Cdim6],[1,'C',C],[1,'F',CM7],[1,'F',C6],[1,'G',C7], [1,'C',C],[1,'C',C7],[1,'F',CM7],[1,'F#',Cdim6],[1,'G#',Cdim6],[1,'G',C7], [1,'C',C],[1,'G',Csus47],[1,'G',C7],[1,'F#',Cdim6],[1,'C',C],[1,'G',Csus47],[1,'G',C7],[1,'C',C7],[1,'F',C],[1,'G',C],[1,'C',C]] #end_scale = [[0.5,'C',Cm],[0.5,'C',P]] end_scale = [[1,'C',P]] pattern = pattern_gen(scales, end_scale, melody_len) #bass1 = pattern_gen(bass1, end_scale, melody_len) # Solo voice range_1 = liniar_range(56,70,86,94) rythem1, notenr_1 = ran_duration([1/16,1/8, 1/4,1/2], [0,3,3,0.5], melody_len,end_dur) melody1 = acceptance_melody([-2,-1, 0, 1, 2],[1, 5, 1, 5, 1],pattern, 76, range_1, notenr_1, rythem1) volumes1 = ran_volume([0,100], [1,6], notenr_1 ) notes1 = NoteSeq( [Note(no,octave=0, dur=du, volume=vo) for no,du,vo in zip(melody1,rythem1,volumes1)] ) # Bass1 Accustic range_2 = liniar_range(30,38,50,62) rythem2, notenr_2 = ran_duration([1/8, 1/4,1/2], [4,3,0], melody_len,end_dur) melody2 = acceptance_melody([-2,-1, 0, 1, 2],[0, 3, 1, 3, 0],pattern, 50, range_2, notenr_2,rythem2) volumes2 = ran_volume([0,100], [0,8], notenr_2 ) notes2 = NoteSeq( [Note(no,octave=0, dur=du, volume=vo) for no,du,vo in zip(melody2,rythem2,volumes2)] ) # Bass2 Organ range_6 = liniar_range(30,38,50,62) rythem6, notenr_6 = ran_duration([1/8, 1/4,1/2], [0,1,1], melody_len,end_dur) melody6 = acceptance_melody([-2,-1, 0, 1, 2],[1, 1, 1, 1, 1],pattern, 48, range_6, notenr_6,rythem6) volumes6 = ran_volume([0,120], [0,8], notenr_6 ) notes6 = NoteSeq( [Note(no,octave=0, dur=du, volume=vo) for no,du,vo in zip(melody6,rythem6,volumes6)] ) # Chord Voices range_3 = liniar_range(46,56,73,78) rythem3, notenr_3 = ran_duration([1/8, 1/4,1/2], [1,3,1], melody_len,end_dur) melody3 = acceptance_melody([-2,-1, 0, 1, 2],[0, 3, 1, 3, 0],pattern, 71, range_3, notenr_3,rythem3) volumes3 = ran_volume([0,100], [0,8], notenr_3 ) notes3 = NoteSeq( [Note(no,octave=0, dur=du, volume=vo) for no,du,vo in zip(melody3,rythem3,volumes3)] ) range_4 = liniar_range(46,56,73,78) rythem4, notenr_4 = ran_duration([1/8, 1/4,1/2], [1,3,1], melody_len,end_dur) melody4 = acceptance_melody([-2,-1, 0, 1, 2],[0, 3, 1, 3, 0],pattern, 66, range_4, notenr_4,rythem4) volumes4 = ran_volume([0,100], [0,8], notenr_4 ) notes4 = NoteSeq( [Note(no,octave=0, dur=du, volume=vo) for no,du,vo in zip(melody4,rythem4,volumes4)] ) range_5 = liniar_range(46,56,73,78) rythem5, notenr_5 = ran_duration([1/8, 1/4,1/2], [1,3,1], melody_len,end_dur) melody5 = acceptance_melody([-2,-1, 0, 1, 2],[0, 3, 1, 3, 0],pattern, 60, range_5, notenr_5,rythem5) volumes5 = ran_volume([0,100], [0,8], notenr_5 ) notes5= NoteSeq( [Note(no,octave=0, dur=du, volume=vo) for no,du,vo in zip(melody5,rythem5,volumes5)] ) plot_range([range_1,range_2,range_3],['Flute','Bass','Strings'],tune_name) instruments = [71,43,49,49,49,16] notes = [notes1,notes2,notes3,notes4,notes5,notes6] return notes, instruments,tune_name .. raw:: html
tune__211_A
tune_211_A


**Instruments:** Available are at lest the 128 General-Midi (GM) Instruments. Depending on the sound-fonts there is a bigger choice. A list of the GM instruments can be found here. https://jazz-soft.net/demo/GeneralMidi.html .. code:: python3 def gen_midi(): # squezze into a MIDI framework notes, instruments, tune_name = tune_211_A() # <--- select a tune <<-- <<<<<<<<<--- select a tune ----- nTracks = len(notes) m = Midi(number_tracks=nTracks, tempo=120, instrument=instruments) for iTrack in range(nTracks): m.seq_notes(notes[iTrack], track=iTrack) #--- write the MIDI file ----- midi_file_name = tune_name +'.mid' # set the name of the file m.write(midi_file_name) return midi_file_name .. code:: python3 ######--- Main ---###### midi_file_name = gen_midi() midi_play(midi_file_name) midi_audio(midi_file_name) midi_png(midi_file_name) .. image:: output_9_0.png External **Music\_Generation** library -------------------------------------- This library changes from version to version. New or changed code is first explained above. This is a copy of music\_generation.py .. literalinclude:: music_generation.py :language: python