在mac命令行上生成特定频率的音调

时间:2012-12-07 09:42:27

标签: macos audio terminal

我需要在命令行上生成给定频率的音符

以下是音符http://www.phy.mtu.edu/~suits/notefreqs.html

的频率列表

例如:

$ some-app -frequency 523.25 -timeinseconds 3

它可以是原生的mac,python或ruby工具。我需要安装的库越少越好。也许我可以用mac做点什么:说或者是afplay?

这将用于发送音乐笔记的其他项目,我想在使用它时听到它。

4 个答案:

答案 0 :(得分:11)

SoX非常适用于此目的,并且可以在brew中使用:

$ brew install sox
$ play -n synth 3 sin 523.25

您还可以将声音保存到文件中:

$ play -n out.wav synth 3 sin 523.25

答案 1 :(得分:8)

它简单,陈旧且无需维护,但请查看https://github.com/psycotica0/tone-generator

$ brew install sdl
$ git clone https://github.com/psycotica0/tone-generator.git
$ cd tone-generator && make
$ ./generator 2600 2

答案 2 :(得分:4)

$ say "do ray me fa so la te do"

LOLS。

答案 3 :(得分:2)

我根据@ arbovm的答案编写了一个脚本,为特定音符生成音调。

用法:

./tone.sh G# 4

脚本:

#!/bin/bash

# plays middle c with no args
RAW_NOTE=${1:-C}
NOTE=$( tr '[:upper:]' '[:lower:]' <<< "$RAW_NOTE" )
OCTAVE=${2:-4}

case "$NOTE" in
"a")
    NOTE_INT=9
    ;;
"a#" | "bb")
    NOTE_INT=10
    ;;
"b")
    NOTE_INT=11
    ;;
"c")
    NOTE_INT=0
    ;;
"c#" | "db")
    NOTE_INT=1
    ;;
"d")
    NOTE_INT=2
    ;;
"d#" | "eb")
    NOTE_INT=3
    ;;
"e")
    NOTE_INT=4
    ;;
"f")
    NOTE_INT=5
    ;;
"f#" | "gb")
    NOTE_INT=6
    ;;
"g")
    NOTE_INT=7
    ;;
"g#" | "ab")
    NOTE_INT=8
    ;;
*)
    echo "Note not recognized"
    exit 1
    ;;
esac

# calc 12th root of 2 to get equal temperament ratio between notes
# see http://phodd.net/gnu-bc/bcfaq.html#bccbrt
EQL_TEMPERAMENT=$( bc -l <<< 'e(l(2)/12)' )
A4_HZ=440
A0_HZ=$( bc -l <<< "$A4_HZ / 16" )
C0_HZ=$( bc -l <<< "$A0_HZ * ( 1 / $EQL_TEMPERAMENT ) ^ 9" )

HZ=$( bc -l <<< "$C0_HZ * 2^$OCTAVE * $EQL_TEMPERAMENT ^ $NOTE_INT" )

# requires sox
DURATION=99999999 # forever
play -n synth $DURATION sin $HZ