SPKR(4)

名称
speaker, spkr - コンソールスピーカのデバイスドライバ

書式
pseudo-device speaker #include <machine/speaker.h>

解説
スピーカデバイスドライバは、 FreeBSD が走っている IBM-PC 互換 PC 上で、 アプリケーションがコンソールスピーカを制御できるようにします。

いかなるときでも、このデバイスをオープンできるのは ただ 1 つのプロセスだけです。 このため、このデバイスのロックと解放には、 open(2) と close(2) を使用します。 他のプロセスがデバイスを独占している時にオープンしようとすると、 EBUSY エラーを示して -1 を返します。 デバイスへの書き込みは、 ASCII 文字で単純にメロディを表記した 演奏文字列 (`play string') として解釈されます。 ioctl(2) リクエストによる任意の周波数の発音もサポートされています。

発音することでプロセッサを独占することはありません。 実際には、ドライバは PC ハードウェアが音を発している間の ほとんどの時間をスリープして待っています。 他のプロセスはドライバが走っている間にビープを鳴らすことができます。

アプリケーションは、スピーカのファイル記述子に対して ioctl(2) 呼び出しをすることにより、スピーカドライバを直接制御可能です。 ioctl(2) インタフェースについての定義は /usr/include/machine/speaker.h にあります。 これらの呼び出しに使われる tone_t 構造体には、 周波数 (ヘルツ) と持続時間 (1/100 秒単位で) を指定する 2 つのフィールドがあります。 周波数 0 は、休符と解釈されます。

現在そのような ioctl(2) 呼び出しは 2 つあります。 SPKRTONE は、第 3 引数に単一の tone 構造体へのポインタ 1 個を受け取り、 それを演奏します。 SPKRTUNE は、単一の tone 構造体配列の先頭へのポインタ 1 個を受け取り、 それらを順番に演奏します。 この配列は末尾が持続時間 0 のメンバで終っていることが必要です。

演奏文字列の語法は IBM Advanced BASIC 2.0 の PLAY 文の習慣を模倣しています。 PLAY 文の MB, MF, X 要素は時分割環境では役に立たないため除かれます。 `オクターブ追従' 機能とスラー記号は新しく追加されたものです。

7 オクターブ 84 音が使用可能で 1-84 の番号がついています。 それぞれのオクターブは C から B まで続いていて 0-6 の番号がついています。 音階は A440 に合わせて調律されていて、オクターブ 3 は真中の C から始まります。 デフォルトでは演奏機能は半秒の音符を発音し、そのうち最後の 1/16 秒は休みます。

演奏文字列は左から右へと、演奏コマンドグループの連続として解釈されます。 大文字小文字は区別されません。演奏コマンドグループは次の通りです:

CDEFGAB
    A から G までの文字は対応する音を現在のオクターブで鳴らします。 音符文字にはオプションで、 # + - のうちいずれかひとつの “臨時記号” を続けることができます。このうち最初の 2 つは音を半音高くし、 最後のものは音を半音低くします。 また音符文字の後には音長を表す数字と付点記号 (後述) をつけることもできます。 音長は次の L コマンドの場合と同様に解釈されます。

O n もし n が数字なら、以後のオクターブを設定します。 n に L または N のいずれかを指定することにより、 オクターブ追従を有効または無効にすることができます (デフォルトでは無効です)。 オクターブ追従が有効になっている時は、1 組の音符を解釈すると、 音符間での音程の差が最小になるように必要に応じてオクターブが変化します。 したがって、 ``olbc'' は ``olb>c'' のように、 ``olcb'' は ``olc<b'' のように演奏されます。 オクターブ追従は、> と < と O[0123456] に続く、1 音符については無効です。 (オクターブ追従機能は IBM BASIC ではサポートされていません。)

>   現在のオクターブを 1 つ上げます。

<   現在のオクターブを 1 つ下げます。

N n 音符 n を演奏します。 n は 1 から 84 か、現在の音長の休符として 0 です。 付点記号を続けることもできます。

L n 音符の音長を設定します。デフォルトは L4 で、四分音符です。 この値は 1 から 64 までが認められます。 L1 は全音符に、 L2 は二分音符に、 L4 は四分音符に、などと設定されます。

P n n を L n と同様に解釈した休符です。付点記号をつけることもできます。 ~ と書くこともできます。

T n 1 分あたりの四分音符の数を設定します。デフォルトは 120 です。 よくあるテンポの音楽名:

                	テンポ    	分あたり拍数
        とても遅い	Larghissimo
                	Largo    	40-60
                 	Larghetto    	60-66
                	Grave
                	Lento
                	Adagio       	66-76
        遅い    	Adagietto
                	Andante   	76-108
        中くらい   	Andantino
                	Moderato	108-120
        速い    	Allegretto
                	Allegro   	120-168
                	Vivace
                	Veloce
                	Presto    	168-208
        とても速い	Prestissimo

M[LNS]
    調音を設定します。 MN (N は普通 (normal) を示します) がデフォルトで、音符の最後 1/8 を休みます。 レガート (休みなし) にするには ML を、スタッカート (1/4 休む) にするには MS を設定できます。

音符 (つまり CDEFGAB または N コマンド文字グループ) には付点記号 (.) を続けることができます。 それぞれの付点記号は 1 つにつき、音符の音長を 1.5 倍にします。 したがって、付点記号が 1 つついた音符はついていないものの 3/2 の音長に、 2 つついた音符は 9/4 の音長に、 3 つついた音符は 27/8 の音長になります。

音符と付点記号にはスラー記号 (_) を続けることができます。 これによって音符の後に普段ある小さな休みが埋められて、 音符を次の音符にスラーでつなげます。(スラー機能は IBM BASIC ではサポートされていません。)

演奏文字列中の空白は単に飛ばされるので、 楽節を分けるのに使うことができます。

バグ
音程テーブルの丸めや、発音ハードウェアやタイマハードウェアの こぼれ (どちらも精度を考慮していない) のため、 音程の正確さやタイミングは数学的に厳密ではありません。 音量調節はありません。

2 つ以上の付点記号の動作は標準的な音楽記号を反映していません。 標準的には、それぞれの付点記号は前の付点の半分だけ音長を長くするのであり、 付点によって修正された音符の半分ではありません。 つまり、付点記号が 1 つついた音符はついていないものの 3/2 の音長に、 2 つついた音符は 7/4 の音長に、 3 つついた音符は 15/8 の音長になります。 それでも、3/2 倍にする解釈は IBM BASIC マニュアルに記されているため、 互換性のためにそのままにしています。

非常に長い (システムの物理 I/O ブロックよりも長い) 演奏文字列では、 ブロック境界をまたがるために、 音符の修飾や数値が時々間違って解釈されることがあります。

関連ファイル

/dev/speaker
    スピーカデバイスファイル

関連項目
spkrtest(8)

作者
Eric S. Raymond <esr@snark.thyrsus.com> 1990 年 6 月

移植者
Andrew A. Chernov <ache@astral.msk.su>

歴史
speaker デバイスは FreeBSD 1.0 に初めて登場しました。