2013-05-03 11 views
7

की चरम सीमा है I संगीतकार हूं और मैं क्लोजर में एक फ़ंक्शन लिखने के साथ खेल रहा हूं ताकि पिच ए 4 और ए 5 (आवृत्तियों 440Hz और 880Hz क्रमशः) के बीच एक सरल ग्लिसैंडो को पुन: पेश किया जा सके। घातीय वक्र, लेकिन मैं परेशानी में भाग रहा हूँ। मूल रूप से मैं इस तरह उपयोग करना चाहते हैं: सिवाय मैं अंत में भी यह एक तीसरा तर्क के रूप में एक नमूना दर देना चाहते हैंग्लिसंडो फ़ंक्शन जिसका तर्क कोडोमेन

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

मैं इस समस्या लगता है कि जिस तरह से मैं समारोह का उपयोग करना चाहते है। कुछ ऐसा कहने के बजाय "x1 से x2 तक glissando जहां f (x) = x^2" मैं वास्तव में कहने की कोशिश कर रहा हूं "f (x) == 440 से f (x) == 880 तक glissando" तो मैं ' एम ने वास्तव में शुरुआत में काम करने के लिए एक्स की एक श्रृंखला नहीं दी है, इसलिए इस मामले में मैंने कड़ी मेहनत 0 से 10000 क्यों की, लेकिन यह बदसूरत है।

जो कुछ मैं करने की कोशिश कर रहा हूं उसे पूरा करने का एक बेहतर तरीका क्या है?

अद्यतन: मैंने टर्मिनोलॉजी में गलती की है जिसे फिक्सिंग की आवश्यकता है (यहां लोगों के सभी लोगों के लिए जो क्लोजर में ग्लिसेंडो को नोट करना चाहते हैं)। तीसरा तर्क वास्तव में नमूना दर नहीं है, यह संख्या के नमूने होना चाहिए। दूसरे शब्दों में, नमूना दर (जो 44100 हर्ट्ज या 48000 हर्ट्ज, आदि हो सकती है) निर्धारित समय के लिए नमूने की संख्या निर्धारित करता है।

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

उत्तर

5

आप एक e घातीय 44100 का एक नमूना दर पर 500 मिलीसेकेंड की अवधि से अधिक A5 के लिए ए 4 से वक्र के साथ एक glissando की जरूरत है, तो आप इन कार्यों का उपयोग कर सकते

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

यह ठीक आपके Gliss वक्र फिट नहीं करता है क्योंकि: यहाँ एक सरल घातीय वक्र दर नमूने के साथ आवृत्ति रेंज की सीमा पर वितरित मैं e का उपयोग एक्सपोनेंट के रूप में कर रहा हूं हालांकि मुझे संदेह है कि अगर आप इसे overtone पर खिलाते हैं तो यह अच्छा लगेगा;) मुझे संदेह है कि एक उचित संगीत ग्लिस इस फ़ंक्शन में 1 के एक्सपोनेंट का उपयोग करेगा जो मैंने विकिपीडिया लेख में पढ़ा है।

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

यह एक अच्छा जवाब है। मुझे निश्चित रूप से यह पसंद है कि आपने 'ई' चुना है और आपने इसका उल्लेख किया है। मुझे निश्चित रूप से ओवरटोन के साथ इसका परीक्षण करना चाहिए। 1 के एक्सपोनेंट के लिए, मुझे लगता है कि एक संगीत स्टाफ पर नोटेशन ऐसा लगता है कि इसे इस तरह से किया जाना चाहिए, लेकिन व्यवहार में वे लगभग बहुत ही रैखिक रूप से प्रदर्शन नहीं कर रहे हैं। – tjb1982

संबंधित मुद्दे