import csv,os

def gen_sample_midi_events(pitch,velA,note_on_sec,note_off_sec):

    markA = []
    msgA  = []
    tpqn  = 1260
    bpm   = 60

    ticks_per_sec      = tpqn * bpm / 60.0
    ticks_per_note_on  = ticks_per_sec * note_on_sec
    ticks_per_note_off = ticks_per_sec * note_off_sec
    uid                = 0
    dticks             = 0
    cur_sec            = 0;
    
    r = { 'uid':len(msgA),
           'tpQN':tpqn,
           'bpm':bpm,
           'dticks':0,
           'ch':None,
           'status':None,
           'd0':None,
           'd1':None }

    msgA.append(r);

    for vel in velA:

        ch     = 0
        status = 0x90
        
        
        r = { 'uid':len(msgA),
               'tpQN':None,
               'bpm':None,
               'dticks':dticks,
               'ch':ch,
               'status':status,
               'd0':pitch,
               'd1':vel }

        msgA.append(r)

        dticks = ticks_per_note_on
        
        r  = { 'uid':len(msgA),
               'tpQN':None,
               'bpm':None,
               'dticks':dticks,
               'ch':ch,
               'status':status,
               'd0':pitch,
               'd1':0 }

        msgA.append(r)

        dticks = ticks_per_note_off

        markA.append( (cur_sec, cur_sec+note_on_sec, vel) )

        cur_sec += note_on_sec + note_off_sec

    return msgA,markA

def write_file( fname, msgA ):

    fieldnames = list(msgA[0].keys())

    with open(fname,"w") as f:
        wtr = csv.DictWriter(f, fieldnames=fieldnames)

        wtr.writeheader()

        for m in msgA:
            wtr.writerow(m)
        
def write_marker_file(fname, markA ):

    with open(fname,"w") as f:
        for beg_sec,end_sec,vel in markA:
            f.write(f"{beg_sec}\t{end_sec}\t{vel}\n")
    
def gen_midi_csv_and_marker_files( pitch, velA, note_on_sec, note_off_sec, out_dir ):
    
    msgA,markA = gen_sample_midi_events(pitch,velA,note_on_sec,note_off_sec)

    midi_csv_fname = os.path.join(out_dir,f"{pitch}_sample.csv")
    mark_fname     = os.path.join(out_dir,f"{pitch}_marker.txt")

    write_file(midi_csv_fname,msgA)
    write_marker_file(mark_fname,markA)

    return csv_fname, mark_fname


if __name__ == "__main__":

    out_dir        = "/home/kevin/temp/wt"
    note_on_sec    = 1.0
    note_off_sec   = 0.5
    min_pitch      = 21
    max_pitch      = 108
    pitch          = 60
    velA           = [1,8,15,22,29,36,42,49,56,63,70,77,84,91,98,105,112,119,126]
    velA           = [ 1,5,10,16,21,26,32,37,42,48,53,58,64,69,74,80,85,90,96,101,106,112,117,122,127]


    csv_fname, mark_fname = gen_midi_csv_and_marker_files( pitch, velA, note_on_sec, note_off_sec, out_dir )