1.05 Instruments

Adding instruments to the tracks and improving gen_midi( ) such that the number of tracks does not mater.

from pyknon.genmidi import Midi
from pyknon.music import Rest, Note, NoteSeq
import numpy as np

Pyknon

There exist two different notations one with the Note() function and in a simplified plain text version

Note(value , octave , dur , volume)

  • value: integer, note hight in semitones, 0 = middle C = midi 60
  • octave: octave number
  • dur: duration, 0.25 = quarter note
  • volume: from 1 to 127

Instruments: Available are at least 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://en.wikipedia.org/wiki/General_MIDI#Program_change_events Remember to subtract 1 as the list starts with 1 and not 0.

major = [0,2,4,5,7,9,11,12]
minor = [0,2,3,5,7,8,10,12]


def tune_D():
    tune_name = 'tune_D'   # A row of major chords
    notes1 = NoteSeq( [Note(no) for no in major] )
    notes2 = NoteSeq( [Note(no +4) for no in major] )
    notes3 = NoteSeq( [Note(no +7) for no in major] )
    notes = [notes1, notes2, notes3]
    instruments = [12, 12, 12]
    return notes, instruments,tune_name

def tune_E():
    tune_name = 'tune_E'            # somtimes forming diatonic chords
    major2 = major[:-1] + major[::-1]  # cut last element and adding the reverse
    notes1 = NoteSeq( [Note(no) for no in major2] )
    notes2 = NoteSeq( [Rest(0.5)] + [Note(no) for no in major2] )
    notes3 = NoteSeq( [Rest(1)]   + [Note(no) for no in major2] )
    notes = [notes1, notes2, notes3]
    instruments = [66, 42, 19]
    return notes, instruments,tune_name



def gen_midi():
#     squezze into a MIDI framework
    notes, instruments, tune_name = tune_E() #  <--- select a tune  <<--     <<<<<<<<<--- select a tune -----
    nTracks = len(notes)

    m = Midi(number_tracks=nTracks, tempo=100, 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

Midi: Play and Generate audio-file

Externel players offered a better sound quality in comparison with python liaberys. We uses VLC and Musescore

import subprocess
default_soundfont = '/usr/share/sounds/sf3/MuseScore_General.sf3'

def midi_play(midi_in, soundfont= default_soundfont):
    subprocess.call(['cvlc', midi_in , 'vlc://quit'])   # cvlc = vlc without gui

def midi_audio(midi_in, name_out = 'none', soundfont= default_soundfont):
    if name_out == 'none' :
        name_out = midi_in.replace('.mid', '.flac')
    else:
        name_out = name_out + '.flac'
    subprocess.call(['mscore', '-o', name_out, midi_in]) # -o = export as

def midi_png(midi_in, name_out = 'none'):
    if name_out == 'none' :
        name_out = midi_in.replace('.mid', '.png')
    else:
        name_out = name_out + '.png'
    subprocess.call(['mscore', '-o', name_out, '-T', '2', midi_in]) # -o = export as , -T 0 = cut page with 0 pixel
######---  Main  ---######
midi_file_name = gen_midi()

midi_play(midi_file_name)
midi_audio(midi_file_name)
midi_png(midi_file_name)

tune_D
tune_E
tune_E (the saxaphone is a transposing instrument)