ホームに戻る
 リソースの使用(音系)

1、語句
2、サウンドの開始
3、チャンネルの設定
4、サウンドの終了
5、インストゥルメントの設定
6、BGMを鳴らす
7、SEを鳴らす
8、サンプルソース
9、sndcnvの使用法
10、リソースの結合
11、メモ


 1、語句

 チャンネル
チャンネルは1から4まで使用可
同時に4つまで音を出力できることを表す
チャンネル2はボイスモード
チャンネル3はスウィープモード
チャンネル4はノイズモード
に変更が可能

BGM
 音楽ファイル ひとつのファイルに1曲
 拡張子は.mml

SE
 効果音ファイル ひとつのファイルに複数指定可
 拡張子は.mml

内部SE
 SEファイルの内部に含まれるSE

インストゥルメント
 音源設定ファイル BGMやSEで使用する音に関する初期設定など
 拡張子は.prg

 2、サウンドの開始

sound_open();

サウンドの開始

 3、チャンネルの設定

sound_set_channel(0x8F);

チャンネル1から4を使用 ノイズモード使用

bit0:1でチャンネル1使用
bit1:1でチャンネル2使用
bit2:1でチャンネル3使用
bit3:1でチャンネル4使用
bit4:予約 必ず0を指定
bit5:1でチャンネル2のボイスモード使用
bit6:1でチャンネル3のスウィープモード使用
bit7:1でチャンネル4のノイズモード使用

 4、サウンドの終了

sound_close();

サウンドの終了

 5、インストゥルメントの設定

set_instrument(sample_inst, 0x8003);

インストゥルメントをシステム、BGM、SEで有効にする

引数1:インストゥルメント配列の先頭ポインタ
引数2:インストゥルメントの使用状態

bit0 :1でインストゥルメントをBGMで有効にする
bit1 :1でインストゥルメントをSEで有効にする
bit15:1でインストゥルメントをシステムで有効にする

 6、BGMを鳴らす

bgm_play(sample_bgm, 1);

引数1:BGM配列の先頭ポインタ
引数2:0で1回のみの再生 1でループ再生

 7、SEを鳴らす

se_play(sample_se, 0);

引数1:SE配列の先頭ポインタ
引数2:再生する内部SEの番号

 8、サンプルソース

インストゥルメント1つ
BGMを3つ
SEを1つ(内部SEは2つ)
リソースから読み込み使用するサンプル

「sound.il」を使用します

/*
*   sound.c
*/

#include <sys/bios.h>
#include <resource.h>
#include "il_sound.h"

#define BGM_MAX 3
#define SE_MAX 1

#define SOUND_CHANNEL 0x8F

#define EXT /*extern*/

/* 関数 */
EXT BOOL sound_init();
EXT void sound_end();
EXT void play_bgm(int n);
EXT void play_se(int s, int n);

SoundIL soundIL;

res_inst_t far *inst;
res_music_t far *bgm[BGM_MAX];
res_se_t far *se[SE_MAX];

BOOL sound_active;

BYTE far *find_resource(WORD type, int index)
{
  extern void far *_resource;
  BYTE far *res = (BYTE far *)_resource;
  while(((res_t far *)res)->magic == RESID){
    if(((res_t far *)res)->type == type && (index--) == 0)
      return res;
    res += (((res_t far *)res)->size << 4);
  }
  return NULL;
}

void inst_init()
{
  inst = (res_inst_t far *)find_resource(RESID_INST, 0);
  set_instrument(inst, INSTBIT_SYSTEM + INSTBIT_BGM + INSTBIT_SE);
}

void bgm_init()
{
  int i;

  for(i = 0; i < BGM_MAX; i++){
    bgm[i] = (res_music_t far *)find_resource(RESID_MUSIC, i);
  }
}

void se_init()
{
  int i;

  for(i = 0; i < SE_MAX; i++){
    se[i] = (res_se_t far *)find_resource(RESID_SE, i);
  }
}

BOOL sound_init()
{
  if(open_sound_il(&soundIL) != E_FS_SUCCESS){
    sound_active = FALSE;
    return FALSE;
  }

  sounddrv_init();

  sound_set_channel(SOUND_CHANNEL);

  sound_open();

  inst_init();
  bgm_init();
  se_init();

  sound_active = TRUE;

  return TRUE;
}

void sound_end()
{
  if(sound_active){
    sound_close();
    sounddrv_release();
  }
}

void play_bgm(int n)
{
  bgm_play(bgm[n], PLAY_LOOP);
}

void play_se(int s, int n)
{
  se_play(se[s], n);
}

int main(int argc, char *args[])
{
  BOOL loop = TRUE;

  sound_init();

  do{
    int key = key_wait();
    switch(key){
      case KEY_RIGHT1:
        play_bgm(0);
        break;
      case KEY_DOWN1:
        play_bgm(1);
        break;
      case KEY_LEFT1:
        play_bgm(2);
        break;
      case KEY_A:
        play_se(0, 0);
        break;
      case KEY_B:
        play_se(0, 1);
        break;
      case KEY_START:
        loop = FALSE;
        break;
      default:
        break;
    }
  }while(loop);

  sound_end();

  bios_exit();
}

 9、sndcnvの使用法

sndcnv bgm0.mml     (BGMファイルbgm0.mmlのリソース化)
sndcnv -b2 se.mml   (SEファイルse.mmlのリソース化 2は内部SEの数が2つを表す)
sndcnv -i inst.prg  (インストゥルメントファイルinst.prgのリソース化)

できたリソースは拡張子が.frになる

 10、リソースの結合

mkfent情報ファイル(拡張子.cfのファイル)の設定

name: sound
info: sound_sample
mode: 7
source: sound.bin
resource: inst.fr bgm0.fr bgm1.fr bgm2.fr se.fr
output: sound.fx

この時リソース番号は先に書いたものからつく

inst.fr はインストゥルメントのリソース番号0
bgm0.fr はBGMのリソース番号0
bgm1.fr はBGMのリソース番号1
bgm2.fr はBGMのリソース番号2
se.fr はSEのリソース番号0

 11、メモ

実行には「sound.il」が必要

inserted by FC2 system