from music21 import converter, instrument, note, stream
from music21 import chord

# ABC notation
abc_notation = """
X: 1
T: from blues.mid
M: 4/4
L: 1/8
Q:1/4=70
% Last note suggests Locrian mode tune
K:G % 1 sharps
V:1
%%MIDI channel 10
 (3F,,F,,F,,  (3F,,F,,F,,  (3F,,F,,F,,  (3F,,F,,F,,| \
 (3F,,F,,F,,  (3F,,F,,F,,  (3F,,F,,F,,  (3F,,F,,F,,| \
 (3F,,F,,F,,  (3F,,F,,F,,  (3F,,F,,F,,  (3F,,F,,F,,| \
 (3F,,F,,F,,  (3F,,F,,F,,  (3F,,F,,F,,  (3F,,F,,F,,|
 (3F,,F,,F,,  (3F,,F,,F,,  (3F,,F,,F,,  (3F,,F,,F,,| \
 (3F,,F,,F,,  (3F,,F,,F,,  (3F,,F,,F,,  (3F,,F,,F,,| \
 (3F,,F,,F,,  (3F,,F,,F,,  (3F,,F,,F,,  (3F,,F,,F,,| \
 (3F,,F,,F,,  (3F,,F,,F,, F,,/2F,,/2z/2F,,/2 z2|
F,,/2zF,,/2 F,,/2zF,,/2 F,,/2zF,,/2 F,,/2zF,,/2| \
 (3F,,F,,F,,  (3F,,F,,F,,  (3F,,F,,F,,  (3F,,F,,F,,| \
F,,/2zF,,/2 F,,/2zF,,/2 F,,/2zF,,/2 F,,/2zF,,/2| \
 (3F,,F,,F,,  (3F,,F,,F,,  (3F,,F,,F,,  (3F,,F,,F,,|
F,,/2zF,,/2 F,,/2zF,,/2 F,,/2zF,,/2 F,,/2zF,,/2| \
 (3F,,F,,F,,  (3F,,F,,F,,  (3F,,F,,F,,  (3F,,F,,F,,| \
F,,/2zF,,/2 F,,/2zF,,/2 F,,/2zF,,/2 F,,/2zF,,/2| \
F,,/2z3/2 F,,/2z3/2 F,,/2z3/2 F,,/2
V:2
%%MIDI channel 10
z2 E,,/2z3z/2 E,,/2z3/2| \
z2 E,,/2z3z/2 E,,/2z3/2| \
z2 E,,/2z3z/2 E,,/2z3/2| \
z2 E,,/2z3z/2 E,,/2z3/2|
z2 E,,/2z3z/2 E,,/2z3/2| \
z2 E,,/2z3z/2 E,,/2z3/2| \
z2 E,,/2z3z/2 E,,/2z3/2| \
 (3E,,E,,E,,  (3E,,E,,E,,  (3E,,E,,E,, E,,/2E,,/2z/2E,,/2|
z2 E,,/2z3z/2 E,,/2z3/2| \
z2 E,,/2z3z/2 E,,/2z3/2| \
z2 E,,/2z3z/2 E,,/2z3/2| \
z2 E,,/2z3z/2 E,,/2z3/2|
z2 E,,/2z3z/2 E,,/2z3/2| \
z2 E,,/2z3z/2 E,,/2z3/2| \
z2 E,,/2z3z/2 E,,/2z3/2| \
z/2E,,<E,,E,,<E,,E,,<E,,E,,/2>E,,/2
V:3
%%MIDI channel 10
C,,/2zC,,/2 z3/2C,,/2 C,,/2zC,,>C,,C,,/2| \
C,,/2zC,,/2 z3/2C,,/2 C,,/2zC,,/2 z/2C,,/2z| \
C,,/2zC,,/2 z3/2C,,/2 C,,/2zC,,>C,,C,,/2| \
C,,/2zC,,/2 z3/2C,,/2 C,,/2zC,,/2 z/2C,,/2z|
C,,/2zC,,/2 z3/2C,,/2 C,,/2zC,,>C,,C,,/2| \
C,,/2zC,,/2 z3/2C,,/2 C,,/2zC,,/2 z/2C,,/2z| \
C,,/2zC,,/2 z3/2C,,/2 C,,/2zC,,>C,,C,,/2| \
 (3C,,C,,C,,  (3C,,C,,C,, C,,/2C,,/2z/2C,,/2 z2|
C,,/2zC,,/2 z/2C,,/2z C,,/2zC,,/2 z/2C,,/2z| \
C,,/2zC,,/2 z3/2C,,/2 C,,/2zC,,/2 z3/2C,,/2| \
C,,/2zC,,/2 z/2C,,/2z C,,/2zC,,/2 z/2C,,/2z| \
C,,/2zC,,/2 z3/2C,,/2 C,,/2zC,,/2 z3/2C,,/2|
C,,/2zC,,/2 z/2C,,/2z C,,/2zC,,/2 z/2C,,/2z| \
C,,/2zC,,/2 z3/2C,,/2 C,,/2zC,,/2 z3/2C,,/2| \
C,,/2zC,,/2 z/2C,,/2z C,,/2zC,,/2 z/2C,,/2z| \
C,,/2z3/2 C,,/2z3/2 C,,/2z3/2 C,,/2
"""

def abc_to_midi(abc_notation, output_filename):
    # Convert ABC notation to music21 stream object
    stream_obj = converter.parse(abc_notation)

    # Create MIDI file
    midi_stream = stream.Stream()

    # Set instrument to piano
    midi_stream.append(instrument.Piano())

    # Iterate over each element in the music21 stream
    for element in stream_obj.flat:
        # Check if element is a note
        if isinstance(element, note.Note):
            # Add note to MIDI stream
            midi_stream.append(element)
        # Check if element is a chord
        elif isinstance(element, chord.Chord):
            # Add chord to MIDI stream
            midi_stream.append(element)

    # Write MIDI stream to file
    midi_stream.write('midi', fp=output_filename)

# Usage example
output_filename = 'tabla.mid'
abc_to_midi(abc_notation, output_filename)
print(f"MIDI file '{output_filename}' generated successfully!")