from typing import List
import simpleaudio as sa
import time

#initialiseer de samples
kickSample = sa.WaveObject.from_wave_file("samples\\KickBeelow.wav")
snareSample = sa.WaveObject.from_wave_file("samples\\SM_SW_Clap_snare_04.wav")
hatSample = sa.WaveObject.from_wave_file("samples\\SM_SW_Hat_04.wav")



#input a string for the kick 
inputRhytmkick = input("what rhytm would you like to use for the kick (1 = 1/16, seperated by space) ? ")
print("\n")
rhytmkick = list(inputRhytmkick.split()) #convert string to list for float value's
rhytmkickFloat=list(map(float,rhytmkick))
#input a string for the snare        
inputRhytmSnare =input("what rhytm would you like to use for the snare (1 = 1/16, seperated by space) ? ")
print("\n")
rhytmSnare = list(inputRhytmSnare.split()) #convert string to list for float value's
rhytmSnareFloat=list(map(float,rhytmSnare))

#input a string for the hat
inputRhytmHat =input("what rhytm would you like to use for the hat (1 = 1/16, seperated by space) ? ")
print("\n")
rhytmHat = list(inputRhytmHat.split()) #convert string to list for float value's
rhytmHatFloat=list(map(float,rhytmHat))



### now we have 3 list's with timestamps of the diffrent samples ###



#input the BPM
BPM = int(input("enter the bpm you want to use: "))
# de tijdsduur in seconde voor 1 beat berekenen (float)
oneBeatInSec = (60.0/BPM) 



# een lege list voor de timestamps van iedere sample 
timeStampKick = []
timeStampSnare = []
timeStampHat = []




#vul de list's met timestamps
for i in rhytmkickFloat:
    timeStampKick.append(oneBeatInSec*i)

for i in rhytmSnareFloat:
    timeStampSnare.append(oneBeatInSec*i)

for i in rhytmHatFloat:
    timeStampHat.append(oneBeatInSec*i)




#functie die wordt aangeroepen als de sample moet word afgespeeld
def kickPlay():
    kickSample.play()
    
def snarePlay():
     snareSample.play() 

def hatPlay():
    hatSample.play()
     
     




#initialiseer sequencer
seqCounterKick = int (0)
seqCounterSnare= int (0)
seqCounterHat  = int (0) 

#zet de start tijd op 0
startTimeKick  = time.time()
startTimeSnare = time.time()
startTimeHat   = time.time()




#seqCounterKick telt op wanneer deze met de de tijd van timestamp16th gelijk is
while (seqCounterKick or seqCounterSnare or seqCounterHat < (len(rhytmkick or rhytmSnare or rhytmHat))):
 
    #vergelijkt de huidigetijd met de tijd van timeStampKick array tov startTime
    if time.time() >= startTimeKick + (oneBeatInSec * timeStampKick[seqCounterKick] ):
        print("KICK", seqCounterKick + 1)#speel de sound af + sequence stap verder + nieuwe starttime ophalen
        kickPlay()
        seqCounterKick=seqCounterKick+1
        startTimeKick = time.time()

    #vergelijkt de huidigetijd met de tijd van timeStampSnare array tov startTime
    if time.time() >= startTimeSnare + (oneBeatInSec * timeStampSnare[seqCounterSnare] ):
        print("SNARE", seqCounterSnare + 1)#speel de sound af + sequence stap verder + nieuwe starttime ophalen
        snarePlay()
        seqCounterSnare=seqCounterSnare+1
        startTimeSnare = time.time()

    #vergelijkt de huidigetijd met de tijd van timeStampSnare array tov startTime
    if time.time() >= startTimeHat + (oneBeatInSec * timeStampHat[seqCounterHat] ):
        print("HAT", seqCounterHat + 1)#speel de sound af + sequence stap verder + nieuwe starttime ophalen
        hatPlay()
        seqCounterHat=seqCounterHat+1
        startTimeHat = time.time()
        
    #anders doe maar even niks, om even uit te rusten
    else:
        time.sleep(0.001)

#laatste noot uit laten spelen
time.sleep(1)