2013-05-03 6 views
7

私はミュージシャンであり、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)) 

答えて

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

これはグリスカーブにはあまり適していません私はあなたがそれをovertoneにフィードすると良いと思うが、指数としてを使用しています)私はウィキペディアの記事でこの関数の指数1を適切なミュージカルglissが使用すると思われます。

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) 
+0

これはすばらしい答えです。私は間違いなくあなたが「e」を選んだこと、そしてあなたは倍音を言いました。私はこれを間違いなく倍音でテストしなければなりません。 1の指数については、ミュージシャンの表記は、そうするべきであるように見えると思うが、実際にはほとんど直線的に演奏されることはほとんどない。 – tjb1982

関連する問題