Jestem muzykiem i gram z funkcją pisania w Clojure, aby odtworzyć proste glissando pomiędzy tonami A4 i A5 (częstotliwości odpowiednio 440 Hz i 880 Hz), krzywa wykładnicza, ale wpadam w kłopoty. Zasadniczo chcę go używać tak:Funkcja Glissando, której argumenty są skrajnymi wartościami kodomain
(def A4 440)
(def A5 880)
(gliss A4 A5)
który powinien dać mi coś takiego:
=>(441 484 529 576 625 676 729 784 841)
chyba bym w końcu chciał także nadać mu Sample-szybkość jako trzeci argument.
Ten rodzaj prac:
(defn gliss
[start-pitch end-pitch s-rate]
(let [f (fn [x]
(expt x 2))]
(remove nil?
(map
(fn [x]
(when (and
(>= (f x) start-pitch)
(<= (f x) end-pitch))
(f x)))
(range 0 10000 s-rate)))))
Chyba problem jest sposób chcę używać tej funkcji. Zamiast mówić coś w rodzaju "glissando z x1 do x2, gdzie f (x) = x^2" Naprawdę próbuję powiedzieć "glissando z f (x) == 440 do f (x) == 880", więc ja " tak naprawdę nie miałem do czynienia z zakresem x, z którym początkowo pracowałem, dlatego w tym przypadku po prostu zakodowałem od 0 do 10000, ale to jest brzydkie.
Jaki jest lepszy sposób na wykonanie tego, co próbuję wykonać?
Aktualizacja: popełniłem błąd w terminologii wymaga naprawy (dla wszystkich hordy ludzi, którzy przybyli tu w poszukiwaniu aby zapisywać się glissando w Clojure). Trzeci argument nie jest tak naprawdę częstotliwością próbkowania, powinien być liczbą próbek. Innymi słowy, częstotliwość próbkowania (która może wynosić 44100 Hz lub 48000 Hz itd.) Określa liczbę próbek, które będą potrzebne przez określony czas. Jeśli potrzebne glissando z e
krzywą wykładniczą od A4 do A5 na okres 500 milisekund przy szybkości próbkowania 44100, można użyć następujących funkcji:
(defn gliss
[start end samples]
(map #(+ start
(*
(math/expt (/ (inc %) samples) 2.718281828)
(- end start)))
(range samples)))
(defn ms-to-samps
[ms s-rate]
(/ (* ms s-rate) 1000))
tak:
(def A4 440)
(def A5 (* A4 2))
(def s-rate 44100) ;; historic CD quality sample rate
(gliss A4 A5 (ms-to-samps 500 s-rate))
To jest świetna odpowiedź. Zdecydowanie podoba mi się, że wybrałeś 'e' i wspomniałeś o nadtonie. Zdecydowanie powinienem przetestować to z naciskiem. Co się tyczy wykładnika 1, myślę, że notacja na muzycznej obsadzie sprawia, że wygląda tak, jak powinno być wykonane w ten sposób, ale w praktyce prawie nigdy nie są wykonywane bardzo liniowo. – tjb1982