私はミュージシャンであり、Clojureに関数を書き込んで、ピッチA4とA5(周波数440Hzと880Hzの間)で単純なグリッサンドを再現しています。指数関数的な曲線ですが、私は困っています。私は最終的にも、3番目の引数としてそれをサンプル・レートをさせていただきたいと思い除いGlissando関数は、引数がコードドメインの極端なものです
=>(441 484 529 576 625 676 729 784 841)
:私のような何かを与えるべき
(def A4 440)
(def A5 880)
(gliss A4 A5)
:基本的に私はこのようにそれを使用したいと思います。
作品のこの種:
(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)))))
私は、問題は、私は機能を使用する方法であると思います。 "f(x)= x^2のどこかでglissandoのようなものを言うのではなく、" f(x)== 440からf(x)== 880の "glissando"私は実際にxの範囲を与えていないので、この場合は0〜10000をハードコーディングしているだけですが、それは醜いのです。
私がしようとしていることを達成するためのより良い方法は何ですか?
更新:私は修正が必要な間違いをしました(Clojureでglissandoを表記するためにここに来る人々のすべての大群のために)。 3番目の引数は実際にサンプルレートではなく、サンプル数でなければなりません。つまり、サンプルレート(44100Hzや48000Hzなど)は、特定の時間内に必要となるサンプル数を決定します。このような
(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))
:あなたは44100のサンプリングレートで500ミリ秒の期間にわたって、A4からA5へe
指数曲線でグリッサンドを必要とする場合は、これらの関数を使用する場合があります
(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))
これはすばらしい答えです。私は間違いなくあなたが「e」を選んだこと、そしてあなたは倍音を言いました。私はこれを間違いなく倍音でテストしなければなりません。 1の指数については、ミュージシャンの表記は、そうするべきであるように見えると思うが、実際にはほとんど直線的に演奏されることはほとんどない。 – tjb1982