Skip to content

MIDI Code Examples

charlies-world edited this page Nov 11, 2021 · 8 revisions

Here you will find specific code examples to see how you might use comPoYse to create something on a larger scale. Also check out my other repositories for more examples.

Generating a short passage of quarter and eighth notes from a scale

import random
from compoyse.midi.Note import Note
from compoyse.midi.Measure import Measure
from compoyse.midi.Voice import Voice
from compoyse.midi.Section import Section
from compoyse.midi.Composition import Composition
from compoyse.midi.MIDIDataFileWriter import MIDIDataFileWriter

def generate_new_note():
    new_note = Note()
    new_note.set_letter(scale[random.randrange(0, len(scale))])
    new_note.set_octave(random.randrange(lowest_octave_range, highest_octave_range))
    new_note.set_rhythmic_value(rhythms[random.randrange(0, len(rhythms))])
    new_note.set_velocity(velocity)
    return new_note

composition = Composition()
number_of_voices = 4
number_of_notes = 32
scale = ['Eb', 'F', 'G', 'Ab', 'Bb', 'C', 'D']
lowest_octave_range = 4
highest_octave_range = 6
rhythms = [['eighth'], ['quarter']]
velocity = 100

first_section = Section()
solo_voice = Voice()
measure = Measure()
for each in range(number_of_notes):
    measure.add_beat(generate_new_note())
solo_voice.add_measure(measure)
first_section.add_voice(solo_voice)
first_section.set_quarter_note_bpm(120)
composition.add_section(first_section)

second_section = Section()
for each in range(number_of_voices):
    new_voice = Voice()
    new_measure = Measure()
    for i in range(0, number_of_notes * 2):
        new_measure.add_beat(generate_new_note())
    new_voice.add_measure(new_measure)
    second_section.add_voice(new_voice)
second_section.set_quarter_note_bpm(240)
composition.add_section(second_section)

# if we left "put_voices_in_same_track" as True,
# we would get an error,
# because each of our sections have a different amount of voices
MIDIDataFileWriter(composition, put_voices_in_same_track=False, fileName='passage_in_eb')

Transcribe the pictured musical passage

pictured is the first 5 bars of Mozart Symphony 40

from compoyse.midi.Note import Note
from compoyse.midi.Rest import Rest
from compoyse.midi.Measure import Measure
from compoyse.midi.Voice import Voice
from compoyse.midi.Section import Section
from compoyse.midi.Composition import Composition
from compoyse.midi.MIDIDataFileWriter import MIDIDataFileWriter

velocity = 50

voice = Voice()

measure_one = Measure()
rest = Rest()
rest.set_rhythmic_value(['half','quarter'])
measure_one.add_beat(rest)
measure_one.add_beat(Note(velocity, 'Eb', 5, ['eighth']))
measure_one.add_beat(Note(velocity, 'D', 5, ['eighth']))
voice.add_measure(measure_one)

measure_two = Measure()
measure_two.add_beat(Note(velocity, 'D', 5, ['quarter']))
measure_two.add_beat(Note(velocity, 'Eb', 5, ['eighth']))
measure_two.add_beat(Note(velocity, 'D', 5, ['eighth']))
measure_two.add_beat(Note(velocity, 'D', 5, ['quarter']))
measure_two.add_beat(Note(velocity, 'Eb', 5, ['eighth']))
measure_two.add_beat(Note(velocity, 'D', 5, ['eighth']))
voice.add_measure(measure_two)

measure_three = Measure()
measure_three.add_beat(Note(velocity, 'D', 5, ['quarter']))
measure_three.add_beat(Note(velocity, 'Bb', 5, ['quarter']))
rest = Rest()
rest.set_rhythmic_value(['quarter'])
measure_three.add_beat(rest)
measure_three.add_beat(Note(velocity, 'Bb', 5, ['eighth']))
measure_three.add_beat(Note(velocity, 'A', 5, ['eighth']))
voice.add_measure(measure_three)

measure_four = Measure()
measure_four.add_beat(Note(velocity, 'G', 5, ['quarter']))
measure_four.add_beat(Note(velocity, 'G', 5, ['eighth']))
measure_four.add_beat(Note(velocity, 'F', 5, ['eighth']))
measure_four.add_beat(Note(velocity, 'Eb', 5, ['quarter']))
measure_four.add_beat(Note(velocity, 'Eb', 5, ['eighth']))
measure_four.add_beat(Note(velocity, 'D', 5, ['eighth']))
voice.add_measure(measure_four)

measure_five = Measure()
measure_five.add_beat(Note(velocity, 'C', 5, ['quarter']))
measure_five.add_beat(Note(velocity, 'C', 5, ['quarter']))
voice.add_measure(measure_five)

section = Section()
section.add_voice(voice)
section.set_quarter_note_bpm(240)

composition = Composition()
composition.add_section(section)

MIDIDataFileWriter(composition, fileName='i_heart_mozart')

Transpose a composition up an octave

# create a composition...

for i in range(0, composition.get_number_of_sections()):
    current_section = composition.get_section_at_index(i)
    for j in range(0, current_section.get_number_of_voices()):
        current_voice = current_section.get_voice_at_index(j)
        for k in range(0, current_voice.get_number_of_measures()):
            current_measure = current_voice.get_measure_at_index(k)
            for m in range(0, current_measure.get_number_of_beats()):
                current_beat = current_measure.get_beat_at_index(m)
                if current_beat._is_note(): # rests are unaffected
                    current_beat.alter_octave(1) # transpose up one octave