Closed. This question is opinion-based。它当前不接受答案。
想要改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
2年前关闭。
Improve this question
我是一名音乐家,我正在用Clojure编写函数以在A4和A5(分别为440Hz和880Hz)音高之间再现简单的滑音,并具有指数曲线,但是我遇到了麻烦。基本上我想这样使用它:
应该给我这样的东西:
除了我最终还是想给它一个采样率作为第三个论点。
这种作品:
我想问题是我想使用该功能的方式。与其说“从x1到x2的glissando,其中f(x)= x ^ 2”,我不是说“从f(x)== 440到f(x)== 880的glissando”,而是m最初并没有真正指定x的范围,因此为什么在这种情况下我只是将0编码为10000,但这很丑陋。
有什么更好的方法可以完成我想做的事情?
更新:我在需要修正的术语上犯了一个错误(对于所有来这里希望在Clojure中使用滑行道的人来说都是如此)。第三个参数不是真正的采样率,它应该是采样数。换句话说,采样率(可能是44100Hz或48000Hz等)决定了在特定持续时间内需要的采样数。如果需要在500毫秒的时间内以44100的采样率从A4到A5的
像这样:
这并不完全适合您的gliss曲线,因为我使用
想要改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。
2年前关闭。
Improve this question
我是一名音乐家,我正在用Clojure编写函数以在A4和A5(分别为440Hz和880Hz)音高之间再现简单的滑音,并具有指数曲线,但是我遇到了麻烦。基本上我想这样使用它:
(def A4 440)
(def A5 880)
(gliss A4 A5)
应该给我这样的东西:
=>(441 484 529 576 625 676 729 784 841)
除了我最终还是想给它一个采样率作为第三个论点。
这种作品:
(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”,而是m最初并没有真正指定x的范围,因此为什么在这种情况下我只是将0编码为10000,但这很丑陋。
有什么更好的方法可以完成我想做的事情?
更新:我在需要修正的术语上犯了一个错误(对于所有来这里希望在Clojure中使用滑行道的人来说都是如此)。第三个参数不是真正的采样率,它应该是采样数。换句话说,采样率(可能是44100Hz或48000Hz等)决定了在特定持续时间内需要的采样数。如果需要在500毫秒的时间内以44100的采样率从A4到A5的
e
指数曲线的glissando,则可以使用以下功能:(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))
最佳答案
这是一条简单的指数曲线,分布在频率范围的范围内,并带有速率样本:
(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听起来会很好;在Wikipedia文章中。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)
10-06 16:19