# 簡単な発音のサンプル

1998. 5.28更新

## サンプルについて

このサンプルは出来るだけシンプルに音を鳴らすプログラムです．

## サンプルの流れ

サウンドライブラリ・ドライバの初期化を行い，880Hzの音を再生する．
処理の流れとしては

1. サウンドライブラリ・サウンドドライバの初期化（サンプル関数の`SoundInit`を利用）
2. MIDIポートのハンドル取得（`sdMidiOpenPort`）
3. 発音．
   - MIDIメッセージの作成（`sdMidiSetMes`）
   - MIDIメッセージの送信（`sdMidiSendMes`）
   - サウンドサーバの呼び出し（`sdSysServer`）
4. しばらく待つ．
5. 発音停止．
   - MIDIメッセージの作成（`sdMidiSetMes`）
   - MIDIメッセージの送信（`sdMidiSendMes`）
   - サウンドサーバの呼び出し（`sdSysServer`）
6. 後処理．
7. 無限ループ．

となります．

## 注意点

本サンプルには下記の注意事項があります．

1. サウンドドライバをあらかじめワークメモリ上にダウンロードしておく
   サウンドドライバをあらかじめワークメモリ上にダウンロードしておく．アドレスはプログラム内の`SNDDRV_ADR`と合わせておく．また，アドレスは32バイトアライメントされている必要があります．
2. `sdSysServer`の使用法について
   本来は`sdSysServer`はブランクなどの定期的なタイミングで呼び出する．

## 実際のコーディング

実際のコーディングを下記に提示する．なお，このサンプルはエラーチェックをかなり省いています．

簡単な発音サンプル
``/********************************************************* * * Sound Library Sample * * 簡単な発音を行います．
*
*********************************************************/`
#include <sd_sg.h>
`/* サウンドドライバがあるアドレス */`
#define SNDDRV_ADR (0x8c050000)
int main( void)
{
``SDS_MIDI_MES` midi_mes;
`SDMIDI` midi_handle = NULL;
Sint32 midi_ch = 0x00; `/* MIDIチャンネル番号０ */`
Sint32 i;
`/*
* 初期化を行う
*/`
if ( SoundInit( SNDDRV_ADR) != SDE_ERR_NOTHING)
{`
`/* エラーが起こった */`
goto exit;
` }
`/*
* MIDIメッセージを送信して音を鳴らす
*/`
`/* MIDIポートのオープン */`
if ( `sdMidiOpenPort`( &midi_handle) != SDE_ERR_NOTHING)
{`
`/* エラーが起こった */`
goto exit;
` }
`/* MIDIメッセージの作成（0x90,0x51,0x7F） */`
if ( `sdMidiSetMes`( midi_handle, &midi_mes, `SDD_MIDI_NOTE_ON` | midi_ch, 0x51, 0x7F) != SDE_ERR_NOTHING)
{`
`/* エラーが起こった */`
goto exit;
` }
`/* MIDIメッセージの送信 */`
if ( `sdMidiSendMes`( midi_handle, &midi_mes, 0) != SDE_ERR_NOTHING)
{`
`/* エラーが起こった */`
goto exit;
` }
`/* サウンドサーバを実行（本来Vブランクなどで呼ぶ） */`
`sdSysServer`();
`/*
* しばらく待つ
*/`
for ( i = 0; i < 0x10000; i++);
`/*
* 鳴っている音を止める
*/`
`/* MIDIメッセージの作成（0x90,0x51,0x7F） */`
if ( `sdMidiSetMes`( midi_handle, &midi_mes, `SDD_MIDI_NOTE_OFF` | midi_ch, 0x51, 0x00) != SDE_ERR_NOTHING)
{`
`/* エラーが起こった */`
goto exit;
` }
`/* MIDIメッセージの送信 */`
if ( `sdMidiSendMes`( midi_handle, &midi_mes, 0) != SDE_ERR_NOTHING)
{`
`/* エラーが起こった */`
goto exit;
` }
`/* サウンドサーバを実行（本来Vブランクなどで呼ぶ） */`
`sdSysServer`();
` exit:
`if ( midi_handle != NULL)
{`
`/* MIDIポートのハンドルの破棄 */`
result = `sdMidiClosePort`( midi_handle);
` }
`/* 無限ループ */`
while ( 1);
return ( 0);
` }
`/*EOF*/`
`