Witam!
Napisałem prosty program do komponowania melodii. Cała nuta trwa w nim 4000ms, półnuta 4000ms/2, ćwierćnuta 4000ms/4, ósemka 4000ms/8, a szesnastka 4000ms/16 (w przykładowym programie poniżej dodałem jeszcze 1/32 = 4000/32.
Pytanie pierwsze: dlaczego im krótsze duration - długość trwania dźwięku Beep(frequency,duration) , tym mniej precyzyjnie odgrywa się kilka, bądź kilkanaście dźwięków pod rząd (dźwięki "spóźniają" i wcale nie są równe 1/16, czy 1/32)? Z czego to wynika i jakie są lepsze sposoby (nie mam tu na myśli uczenia się na pamięć całej biblioteki, bo to inna sprawa, chodzi mi raczej o jakąś konkretną funkcję z konkretnej biblioteki)?
Przykładowy program, który pokazuje, na czym polega problem:
from winsound import Beep
Beep(440, 4000)
i = 0
while i < 2:
i += 1
Beep(440, 4000//2)
i = 0
while i < 4:
i += 1
Beep(440, 4000//4)
i = 0
while i < 8:
i += 1
Beep(440, 4000//8)
i = 0
while i < 16:
i += 1
Beep(440, 4000//16)
i = 0
while i < 32:
i += 1
Beep(440, 4000//32)
Pytanie drugie: dlaczego muszę użyć dzielenia całkowitego (np. duration = 4000//2 = 2000) nawet jeśli wynik, po wykonaniu zwykłego dzielenia (4000/2 = 2000) jest liczbą całkowitą? Jeśli użyję zwykłego dzielenia, wyskoczy mi błąd "integer argument expected, got float". Przy okazji: frequency, które podaje się z hertzah, też musi być liczbą całkowitą. Tymczasem dokładne wartości dźwięków mają na ogół coś po przecinku, a w niektórych sytuacjach (robiłem już taki program) trzeba podzielić, albo pomnożyć frequency (przykładowo: ten sam dźwięk o oktawę niżej to wartość tego dźwięku podana w Hz, podzielona na 2). Czy są jakieś funkcje, które przyjmują argument frequency w postaci liczby zmiennoprzecinkowej?