7

私はミュージシャンで、A4 と A5 のピッチ (それぞれ周波数 440Hz と 880Hz) の間の単純なグリッサンドを指数曲線で再現する関数を Clojure で書いて遊んでいますが、問題が発生しています。基本的には、次のように使用したいと思います。

(def A4 440)
(def A5 880)
(gliss A4 A5)

これは私に次のようなものを与えるはずです:

=>(441 484 529 576 625 676 729 784 841)

ただし、最終的には、3 番目の引数としてサンプルレートも指定したいと考えています。

この種の作品:

(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 の場合、x1 から x2 へのグリッサンド」のようなことを言う代わりに、「f(x) == 440 から f(x) == 880 へのグリッサンド」と言いたいので、 m には、最初に使用する x の範囲が実際には与えられていないため、この場合は 0 から 10000 をハードコードしただけですが、これは醜いです。

私がやろうとしていることを達成するためのより良い方法は何ですか?

更新:修正が必要な用語の誤りを犯しました (Clojure でグリッサンドを記譜しようとしてここに来る大勢の人々のために)。3 番目の引数は実際にはサンプルレートではなく、サンプル数でなければなりません。つまり、サンプル レート (44100Hz または 48000Hz など) によって、特定の期間に必要なサンプル数が決まります。44100 のサンプリング レートで 500 ミリ秒にわたって A4 から A5 までの指数曲線を持つグリッサンドが必要な場合は、e次の関数を使用できます。

(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))
4

1 に答える 1

5

これは、レート サンプルを使用して周波数範囲の範囲に分布する単純な指数曲線です。

(ns hello.exp 
  (:require [clojure.math.numeric-tower :as math]))

(defn gliss [start end rate]
  (map #(+ start (* (math/expt (/ (inc %) rate) 2.718281828) (- end start)))   
       (range rate)))

e指数として使用しているため、これはグリス曲線に正確には適合しませ.ウィキペディアの記事。

hello.exp> (gliss 440 880 5)                                                    
(445.5393041947095 476.4535293633514 549.7501826896913 679.8965206341077 880.0)

hello.exp> (map int (gliss 440 880 100)) 
(440 440 440 440 441 441 442 442 443 444 445 446 447 448 449
 451 452 454 455 457 459 461 463 465 467 469 472 474 477 479 
 482 485 487 490 493 497 500 503 506 510 513 517 521 525 529 
 533 537 541 545 550 554 558 563 568 573 577 582 588 593 598 
 603 609 614 620 625 631 637 643 649 655 661 668 674 680 687 
 694 700 707 714 721 728 735 743 750 757 765 773 780 788 796 
 804 812 820 828 837 845 853 862 871 880)
于 2013-05-03T21:13:57.867 に答える