Ben müzisyenim ve Clojure'da A4 ve A5 (sırasıyla 440Hz ve 880Hz frekansları) arasında basit bir glissando oluşturmak için bir işlev yazmakla oynuyorum. üstel eğri, ama başım belaya giriyor. Temelde böyle kullanmak istiyorum: Sonunda da bunu bir üçüncü bağımsız numune-oran vermek istiyorum hariçGlissando İşlevleri, codomain'in cotası olan ekstremler olan
=>(441 484 529 576 625 676 729 784 841)
:
(def A4 440)
(def A5 880)
(gliss A4 A5)
bana böyle bir şey vermesi gereken.
Bu tür eserlerde:
(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)))))
Sorunu sanırım işlevini kullanmak istiyorum yoludur. "X1'den x2'ye kadar glissando gibi bir şey söylemek yerine, f (x) = x^2" demek istiyorum ki, "glissando'dan f (x) == 440 ila f (x) == 880" deniyorum) m aslında başlangıçta çalışmak için x bir dizi vermedi, bu yüzden bu durumda sadece 0 10000 kodlanmış neden, ama bu çirkin.
Yapmaya çalıştığım şeyi başarmanın daha iyi bir yolu nedir?
Güncelleme: Düzeltmeye ihtiyaç duyan terminolojide bir hata yaptım (Clojure'da bir glissando'yu notlamak için buraya gelen insanların tüm orduları için). Üçüncü argüman gerçekten örnekleme oranı değildir, örnek sayısı olmalıdır. Diğer bir deyişle, örnekleme hızı (44100Hz veya 48000Hz, vs. olabilir) belirli bir süre için ihtiyaç duyacağınız örnek sayısını belirler. Böyle
(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))
:
(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))
Bu harika bir yanıttır. Ben kesinlikle "e" yi seçtiğini ve overtone 'dan bahsettiğini beğendim. Bunu kesinlikle overtone ile test etmeliyim. 1'in üslubuna gelince, bir müzikal kadrosundaki notasyonun bu şekilde yapılması gerektiği gibi görünmesini sağladığını düşünüyorum, ancak pratikte neredeyse hiç doğrusal olarak yapılmadılar. – tjb1982