home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FreeWare Collection 3
/
FreeSoftwareCollection3pd199x-jp.img
/
pao
/
t_os
/
sound
/
src
/
fmb.c
< prev
next >
Wrap
Text File
|
1980-01-02
|
23KB
|
815 lines
/*
** < High C V1.4 & 386ASM V2.0 >
**
** FMBファイルで音を出します。
**
** 1990.08.29 : CREATE
** 1990.08.31 : FINISH
**
** < HISTORY >
** 1990.08.29 : CREATE
**
** < note > : TABS = 4
**
** Programed by Y.Hirata ( Nifty ID : NAB03321 )
**
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <snd.h>
#include <fmc.h>
#include "fmb.h"
#define SworkSize 16384 /* サウンド用作業域サイズ */
char Swork[SworkSize]; /* サウンド用作業域 */
char Fmbfile[128] ; /* FM 音色ファイル */
#define FmbSize 6152 /* FM 音色データサイズ */
char Fmbdata[FmbSize] ; /* FM 音色格納領域 */
char Fmbflg = FALSE ; /* FM 音色 READ フラグ */
int Inst1 = 0 ; /* キーボード上段用 */
int Inst2 = 0 ; /* キーボード下段用 */
int Pan1 = 64 ; /* キーボード上段 */
int Pan2 = 64 ; /* キーボード下段 */
int ValNote1 = 0 ; /* キーボード上段音程用 */
int ValNote2 = 0 ; /* キーボード下段音程用 */
/*************************** FMB DATA の読込み *****************************/
void fmb_load()
{
FILE *fp;
fp = fopen( Fmbfile,"rb" );
fread( Fmbdata,1,FmbSize,fp );
fclose( fp );
}
/******************************************************************************
KEY_test : マトリクスからキーが押されているかどうかをチェックする。
******************************************************************************/
int KEY_test( char *matrix, char keyadrs )
/* *matrix : キーマトリクス情報( 16 バイト ) */
/* keyadrs : キーアドレス */
{
unsigned char testbit ;
int c ;
testbit = 0x01 ;
for ( c=0; c<(keyadrs%8); c++ ) testbit <<= 1 ;
if ( (matrix[keyadrs/8] & testbit) == testbit ) return( TRUE ) ;
return( 0 ) ;
}
/**************************** 1つ上の音色に変更 ****************************/
void inst_change_up( int kyb1, int kyb2 )
/* kyb : キーボードの上/下段フラグ */
{
char matrix[16] ; /* キーマトリクス取得用 */
char keyrepflg ; /* キーリピート用フラグ */
char name[9] ; /* FMBインスト名 */
if ( !Fmbflg ) {
printf("\x1b[33m") ;
printf("☆☆☆ 音色の変更はできません! ☆☆☆") ;
printf("\x1b[m\n") ;
return ;
}
keyrepflg = FALSE ; /* キーリピートフラグ・クリア */
do {
if ( kyb1 == KYB_UPPER || kyb2 == KYB_UPPER ) { /* キーボード上段 */
if ( Inst1 == 127 )
Inst1 = 0 ;
else
Inst1 ++ ;
SND_inst_change( 0,Inst1 ) ;
SND_inst_change( 1,Inst1 ) ;
SND_inst_change( 2,Inst1 ) ;
printf("キーボード上段の音色を変更しました。") ;
printf("(INST:%03d)",Inst1) ;
strncpy( name,&Fmbdata[8+Inst1*48],8 ) ;
name[8] = '\0' ;
printf(" < %s >\n",name) ;
}
if ( kyb1 == KYB_LOWER || kyb2 == KYB_LOWER ) { /* キーボード下段 */
if ( Inst2 == 127 )
Inst2 = 0 ;
else
Inst2 ++ ;
SND_inst_change( 3,Inst2 ) ;
SND_inst_change( 4,Inst2 ) ;
SND_inst_change( 5,Inst2 ) ;
printf("キーボード下段の音色を変更しました。") ;
printf("(INST:%03d)",Inst2) ;
strncpy( name,&Fmbdata[8+Inst2*48],8 ) ;
name[8] = '\0' ;
printf(" < %s >\n",name) ;
}
if ( keyrepflg ) {
SOFT_timer( KEY_repeat ) ;
} else {
SOFT_timer( KEY_wait ) ;
keyrepflg = TRUE ;
}
KYB_clrbuf() ; /* キーバッファ・クリア */
KYB_matrix( matrix ) ; /* キーマトリクス取得 */
} while ( KEY_test( matrix,KEY_UP ) ) ;
printf("\n") ;
}
/**************************** 1つ下の音色に変更 ****************************/
void inst_change_down( int kyb1, int kyb2 )
/* kyb : キーボードの上/下段フラグ */
{
char matrix[16] ; /* キーマトリクス取得用 */
char keyrepflg ; /* キーリピート用フラグ */
char name[9] ; /* FMBインスト名 */
if ( !Fmbflg ) {
printf("\x1b[33m") ;
printf("☆☆☆ 音色の変更はできません! ☆☆☆") ;
printf("\x1b[m\n") ;
return ;
}
keyrepflg = FALSE ; /* キーリピートフラグ・クリア */
do {
if ( kyb1 == KYB_UPPER || kyb2 == KYB_UPPER ) { /* キーボード上段 */
if ( Inst1 == 0 )
Inst1 = 127 ;
else
Inst1 -- ;
SND_inst_change( 0,Inst1 ) ;
SND_inst_change( 1,Inst1 ) ;
SND_inst_change( 2,Inst1 ) ;
printf("キーボード上段の音色を変更しました。") ;
printf("(INST:%03d)",Inst1) ;
strncpy( name,&Fmbdata[8+Inst1*48],8 ) ;
name[8] = '\0' ;
printf(" < %s >\n",name) ;
}
if ( kyb1 == KYB_LOWER || kyb2 == KYB_LOWER ) { /* キーボード下段 */
if ( Inst2 == 0 )
Inst2 = 127 ;
else
Inst2 -- ;
SND_inst_change( 3,Inst2 ) ;
SND_inst_change( 4,Inst2 ) ;
SND_inst_change( 5,Inst2 ) ;
printf("キーボード下段の音色を変更しました。") ;
printf("(INST:%03d)",Inst2) ;
strncpy( name,&Fmbdata[8+Inst2*48],8 ) ;
name[8] = '\0' ;
printf(" < %s >\n",name) ;
}
if ( keyrepflg ) {
SOFT_timer( KEY_repeat ) ;
} else {
SOFT_timer( KEY_wait ) ;
keyrepflg = TRUE ;
}
KYB_clrbuf() ; /* キーバッファ・クリア */
KYB_matrix( matrix ) ; /* キーマトリクス取得 */
} while ( KEY_test( matrix,KEY_DOWN ) ) ;
printf("\n") ;
}
/*************************** 1つ右に音源定位変更 ***************************/
void pan_change_right( int kyb1, int kyb2 )
/* kyb : キーボードの上/下段フラグ */
{
char matrix[16] ; /* キーマトリクス取得用 */
char keyrepflg ; /* キーリピート用フラグ */
keyrepflg = FALSE ; /* キーリピートフラグ・クリア */
do {
if ( kyb1 == KYB_UPPER || kyb2 == KYB_UPPER ) { /* キーボード上段 */
if ( Pan1 < 127 ) {
if ( Pan1 == 64 ) {
Pan1 = 127 ;
} else if ( Pan1 == 0 ) {
Pan1 = 64 ;
}
/* FM 音源の場合 : 0 - 64 - 127 の 3段階しか設定できない */
SND_pan_set( 0,Pan1 ) ;
SND_pan_set( 1,Pan1 ) ;
SND_pan_set( 2,Pan1 ) ;
if ( Pan1 == 64 ) {
printf("\x1b[36m") ;
printf("キーボード上段の音源定位を中央に変更しました。 ") ;
printf("\x1b[m") ;
} else {
printf("キーボード上段の音源定位を右端に変更しました。") ;
}
printf("(PAN:%d)\n",Pan1) ;
} else {
printf("\x1b[33m") ;
printf("キーボード上段の音源定位は、右いっぱいです。") ;
printf("\x1b[m") ;
printf("(PAN:%d)\n",Pan1) ;
}
}
if ( kyb1 == KYB_LOWER || kyb2 == KYB_LOWER ) { /* キーボード下段 */
if ( Pan2 < 127 ) {
if ( Pan2 == 64 ) {
Pan2 = 127 ;
} else if ( Pan2 == 0 ) {
Pan2 = 64 ;
}
/* FM 音源の場合 : 0 - 64 - 127 の 3段階しか設定できない */
SND_pan_set( 3,Pan2 ) ;
SND_pan_set( 4,Pan2 ) ;
SND_pan_set( 5,Pan2 ) ;
if ( Pan2 == 64 ) {
printf("\x1b[36m") ;
printf("キーボード下段の音源定位を中央に変更しました。 ") ;
printf("\x1b[m") ;
} else {
printf("キーボード下段の音源定位を右端に変更しました。") ;
}
printf("(PAN:%d)\n",Pan2) ;
} else {
printf("\x1b[33m") ;
printf("キーボード下段の音源定位は、右いっぱいです。") ;
printf("\x1b[m") ;
printf("(PAN:%d)\n",Pan2) ;
}
}
if ( keyrepflg ) {
SOFT_timer( KEY_repeat ) ;
} else {
SOFT_timer( KEY_wait ) ;
keyrepflg = TRUE ;
}
KYB_clrbuf() ; /* キーバッファ・クリア */
KYB_matrix( matrix ) ; /* キーマトリクス取得 */
} while ( KEY_test( matrix,KEY_RIGHT ) ) ;
printf("\n") ;
}
/*************************** 1つ左に音源定位変更 ***************************/
void pan_change_left( int kyb1, int kyb2 )
/* kyb : キーボードの上/下段フラグ */
{
char matrix[16] ; /* キーマトリクス取得用 */
char keyrepflg ; /* キーリピート用フラグ */
keyrepflg = FALSE ; /* キーリピートフラグ・クリア */
do {
if ( kyb1 == KYB_UPPER || kyb2 == KYB_UPPER ) { /* キーボード上段 */
if ( Pan1 > 0 ) {
if ( Pan1 == 127 ) {
Pan1 = 64 ;
} else if ( Pan1 == 64 ) {
Pan1 = 0 ;
}
/* FM 音源の場合 : 0 - 64 - 127 の 3段階しか設定できない */
SND_pan_set( 0,Pan1 ) ;
SND_pan_set( 1,Pan1 ) ;
SND_pan_set( 2,Pan1 ) ;
if ( Pan1 == 64 ) {
printf("\x1b[36m") ;
printf("キーボード上段の音源定位を中央に変更しました。 ") ;
printf("\x1b[m") ;
} else {
printf("キーボード上段の音源定位を左端に変更しました。") ;
}
printf("(PAN:%d)\n",Pan1) ;
} else {
printf("\x1b[33m") ;
printf("キーボード上段の音源定位は、左いっぱいです。") ;
printf("\x1b[m") ;
printf("(PAN:%d)\n",Pan1) ;
}
}
if ( kyb1 == KYB_LOWER || kyb2 == KYB_LOWER ) { /* キーボード下段 */
if ( Pan2 > 0 ) {
if ( Pan2 == 127 ) {
Pan2 = 64 ;
} else if ( Pan2 == 64 ) {
Pan2 = 0 ;
}
/* FM 音源の場合 : 0 - 64 - 127 の 3段階しか設定できない */
SND_pan_set( 3,Pan2 ) ;
SND_pan_set( 4,Pan2 ) ;
SND_pan_set( 5,Pan2 ) ;
if ( Pan2 == 64 ) {
printf("\x1b[36m") ;
printf("キーボード下段の音源定位を中央に変更しました。 ") ;
printf("\x1b[m") ;
} else {
printf("キーボード下段の音源定位を左端に変更しました。") ;
}
printf("(PAN:%d)\n",Pan2) ;
} else {
printf("\x1b[33m") ;
printf("キーボード下段の音源定位は、左いっぱいです。") ;
printf("\x1b[m") ;
printf("(PAN:%d)\n",Pan2) ;
}
}
if ( keyrepflg ) {
SOFT_timer( KEY_repeat ) ;
} else {
SOFT_timer( KEY_wait ) ;
keyrepflg = TRUE ;
}
KYB_clrbuf() ; /* キーバッファ・クリア */
KYB_matrix( matrix ) ; /* キーマトリクス取得 */
} while ( KEY_test( matrix,KEY_LEFT ) ) ;
printf("\n") ;
}
/******************************* 初期設定 **********************************/
void init()
{
char bankname[8] ;
char name[9] ;
int ret ;
printf("\nキーボードを操作すると、FMB ファイルの音色で演奏できます♪\n") ;
printf("\n6重和音まで対応しています♪\n") ;
printf("カーソルキーの上下で音色を変更できます♪") ;
printf(" ( SHIFT+ で上段のみ, CTRL+ で下段のみ )\n") ;
printf("カーソルキーの右左で定位を変更できます♪") ;
printf(" ( SHIFT+ で上段のみ, CTRL+ で下段のみ )\n") ;
printf("PFキーで、音程を変更できます♪ ( PF1 ~ PF9 : PF5 が標準 )\n") ;
printf("終了は、") ;
printf("\x1b[36mBREAKキー\x1b[m") ;
printf(" です!\n") ;
SND_init( Swork ) ; /* サウンド初期化 */
ret = SND_fm_bank_load( Fmbfile,bankname ) ; /* FMバンクロード */
switch ( ret ) {
case 0 :
printf("\nFM 音源の音色は、") ;
printf("\x1b[36m%s \x1b[m",Fmbfile) ;
printf("のデータを使用します。\n") ;
fmb_load() ;
Fmbflg = TRUE ;
break ;
case 1 :
printf("\nFMBファイル") ;
printf(" < \x1b[33m%s\x1b[m > ",Fmbfile) ;
printf("が見つかりません!\n") ;
printf("\x1b[33m") ;
printf("☆☆☆ 音色の変更はできません! ☆☆☆") ;
printf("\x1b[m\n") ;
break ;
case 2 :
printf("\nFMBファイル") ;
printf(" < \x1b[33m%s\x1b[m > ",Fmbfile) ;
printf("の読み込みに失敗しました!\n") ;
printf("\x1b[33m") ;
printf("☆☆☆ 音色の変更はできません! ☆☆☆") ;
printf("\x1b[m\n") ;
break ;
default :
printf("\n\x1b[31m") ;
printf("ERROR \x1b[m: SND_fm_bank_load = %d\n",ret) ;
}
printf("\n") ;
/*
** FM 各チャンネルの音色を初期設定する
*/
SND_inst_change( 0,0 ) ;
SND_inst_change( 1,0 ) ;
SND_inst_change( 2,0 ) ;
SND_inst_change( 3,0 ) ;
SND_inst_change( 4,0 ) ;
SND_inst_change( 5,0 ) ;
SND_elevol_mute( 0x0002 ) ; /* FM 音源のみミュート解除 */
SND_elevol_all_mute( -1 ) ; /* 全ミュートの解除 */
KYB_clic( 1 ) ; /* キークリック音なし */
if ( Fmbflg ) {
printf("キーボード上段の音色は、") ;
strncpy( name,&Fmbdata[8],8 ) ;
name[8] = '\0' ;
printf(" < %s > ",name) ;
printf("(INST:000) です♪\n") ;
printf("キーボード下段の音色は、") ;
strncpy( name,&Fmbdata[8],8 ) ;
name[8] = '\0' ;
printf(" < %s > ",name) ;
printf("(INST:000) です♪\n") ;
}
printf("\n'\x1b[36mド\x1b[m' (C=60) の位置は、") ;
printf("\x1b[36mW\x1b[m と \x1b[36m>\x1b[m です♪\n") ;
printf("\n") ;
}
/************************* キーボード操作による音制御 *************************/
void key_play( char *matrix, char keyadrs )
/* *matrix : キーマトリクス情報( 16 バイト ) */
/* keyadrs : キーアドレス */
{
/* FM のチャンネルは 0 ~ 5 */
static int chan1=0 ; /* キーボード上段のチャンネル */
static int chan2=3 ; /* キーボード下段のチャンネル */
static int channel[128] ; /* 各キーでのON時FMチャンネル */
static char keymake[128] = { /* キー MAKE 状態か? */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
} ;
int ret ;
if ( chan1 > 2 ) chan1 = 0 ;
if ( chan2 > 5 ) chan2 = 3 ;
if ( Key_inf[keyadrs] == KYB_UPPER ) { /* キーボード 上段 */
if ( KEY_test( matrix,keyadrs ) ) { /* キー MAKE */
if ( !keymake[keyadrs] ) { /* キー BREAK -> MAKE */
SND_key_off( chan1 ) ;
ret = SND_key_on( chan1,Key_note[keyadrs]+ValNote1,127 ) ;
if ( ret ) {
if ( Key_note[keyadrs]+ValNote1 > 60 ) {
printf("音が高すぎて発音できません。(NOTE=%d)\n",
Key_note[keyadrs]+ValNote1) ;
} else {
printf("音が低すぎて発音できません。(NOTE=%d)\n",
Key_note[keyadrs]+ValNote1) ;
}
} else {
channel[keyadrs] = chan1 ;
chan1 ++ ;
keymake[keyadrs] = TRUE ;
}
}
} else if ( keymake[keyadrs] ) { /* キー BREAK */
SND_key_off( channel[keyadrs] ) ;
keymake[keyadrs] = FALSE ;
}
} else if ( Key_inf[keyadrs] == KYB_LOWER ) { /* キーボード 下段 */
if ( KEY_test( matrix,keyadrs ) ) { /* キー MAKE */
if ( !keymake[keyadrs] ) { /* キー BREAK -> MAKE */
SND_key_off( chan2 ) ;
ret = SND_key_on( chan2,Key_note[keyadrs]+ValNote2,127 ) ;
if ( ret ) {
if ( Key_note[keyadrs]+ValNote2 > 60 ) {
printf("音が高すぎて発音できません。(NOTE=%d)\n",
Key_note[keyadrs]+ValNote2) ;
} else {
printf("音が低すぎて発音できません。(NOTE=%d)\n",
Key_note[keyadrs]+ValNote2) ;
}
} else {
channel[keyadrs] = chan2 ;
chan2 ++ ;
keymake[keyadrs] = TRUE ;
}
}
} else if ( keymake[keyadrs] ) { /* キー BREAK */
SND_key_off( channel[keyadrs] ) ;
keymake[keyadrs] = FALSE ;
}
}
}
/******************************* 音程の変更 ********************************/
void note_change( char *matrix )
/* *matrix : キーマトリクス情報( 16 バイト ) */
{
if ( KEY_test( matrix,KEY_PF1 ) ) {
if ( KEY_test( matrix,KEY_SHIFT ) ||
( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) ) {
ValNote1 = -48 ;
printf("キーボード上段の音程を標準より4つ下げました。(C=12)\n") ;
}
if ( KEY_test( matrix,KEY_CTRL ) ||
( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) ) {
ValNote2 = -48 ;
printf("キーボード下段の音程を標準より4つ下げました。(C=12)\n") ;
}
printf("\n") ;
} else if ( KEY_test( matrix,KEY_PF2 ) ) {
if ( KEY_test( matrix,KEY_SHIFT ) ||
( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) ) {
ValNote1 = -36 ;
printf("キーボード上段の音程を標準より3つ下げました。(C=24)\n") ;
}
if ( KEY_test( matrix,KEY_CTRL ) ||
( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) ) {
ValNote2 = -36 ;
printf("キーボード下段の音程を標準より3つ下げました。(C=24)\n") ;
}
printf("\n") ;
} else if ( KEY_test( matrix,KEY_PF3 ) ) {
if ( KEY_test( matrix,KEY_SHIFT ) ||
( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) ) {
ValNote1 = -24 ;
printf("キーボード上段の音程を標準より2つ下げました。(C=36)\n") ;
}
if ( KEY_test( matrix,KEY_CTRL ) ||
( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) ) {
ValNote2 = -24 ;
printf("キーボード下段の音程を標準より2つ下げました。(C=36)\n") ;
}
printf("\n") ;
} else if ( KEY_test( matrix,KEY_PF4 ) ) {
if ( KEY_test( matrix,KEY_SHIFT ) ||
( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) ) {
ValNote1 = -12 ;
printf("キーボード上段の音程を標準より1つ下げました。(C=48)\n") ;
}
if ( KEY_test( matrix,KEY_CTRL ) ||
( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) ) {
ValNote2 = -12 ;
printf("キーボード下段の音程を標準より1つ下げました。(C=48)\n") ;
}
printf("\n") ;
} else if ( KEY_test( matrix,KEY_PF5 ) ) {
if ( KEY_test( matrix,KEY_SHIFT ) ||
( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) ) {
ValNote1 = 0 ;
printf("\x1b[36m") ;
printf("キーボード上段の音程を標準にしました♪\x1b[m(C=60)\n") ;
}
if ( KEY_test( matrix,KEY_CTRL ) ||
( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) ) {
ValNote2 = 0 ;
printf("\x1b[36m") ;
printf("キーボード下段の音程を標準にしました♪\x1b[m(C=60)\n") ;
}
printf("\n") ;
} else if ( KEY_test( matrix,KEY_PF6 ) ) {
if ( KEY_test( matrix,KEY_SHIFT ) ||
( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) ) {
ValNote1 = 12 ;
printf("キーボード上段の音程を標準より1つ上げました。(C=72)\n") ;
}
if ( KEY_test( matrix,KEY_CTRL ) ||
( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) ) {
ValNote2 = 12 ;
printf("キーボード下段の音程を標準より1つ上げました。(C=72)\n") ;
}
printf("\n") ;
} else if ( KEY_test( matrix,KEY_PF7 ) ) {
if ( KEY_test( matrix,KEY_SHIFT ) ||
( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) ) {
ValNote1 = 24 ;
printf("キーボード上段の音程を標準より2つ上げました。(C=84)\n") ;
}
if ( KEY_test( matrix,KEY_CTRL ) ||
( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) ) {
ValNote2 = 24 ;
printf("キーボード下段の音程を標準より2つ上げました。(C=84)\n") ;
}
printf("\n") ;
} else if ( KEY_test( matrix,KEY_PF8 ) ) {
if ( KEY_test( matrix,KEY_SHIFT ) ||
( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) ) {
ValNote1 = 36 ;
printf("キーボード上段の音程を標準より3つ上げました。(C=96)\n") ;
}
if ( KEY_test( matrix,KEY_CTRL ) ||
( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) ) {
ValNote2 = 36 ;
printf("キーボード下段の音程を標準より3つ上げました。(C=96)\n") ;
}
printf("\n") ;
} else if ( KEY_test( matrix,KEY_PF9 ) ) {
if ( KEY_test( matrix,KEY_SHIFT ) ||
( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) ) {
ValNote1 = 48 ;
printf("キーボード上段の音程を標準より4つ上げました。(C=108)\n") ;
}
if ( KEY_test( matrix,KEY_CTRL ) ||
( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) ) {
ValNote2 = 48 ;
printf("キーボード下段の音程を標準より4つ上げました。(C=108)\n") ;
}
printf("\n") ;
}
}
/******************************** プレイ開始 *********************************/
void play_start()
{
char matrix[16] ; /* キーマトリクス取得用 */
int c ;
/*
** キー操作開始
*/
do {
KYB_clrbuf() ; /* キーバッファ・クリア */
KYB_matrix( matrix ) ; /* キーマトリクス取得 */
/*
** 音色の変更( 1つ上の音色 )
*/
if ( KEY_test( matrix,KEY_UP ) ) {
if ( KEY_test( matrix,KEY_SHIFT ) ) { /* キーボード上段 */
inst_change_up( KYB_UPPER,KYB_DUMMY ) ;
}
if ( KEY_test( matrix,KEY_CTRL ) ) { /* キーボード下段 */
inst_change_up( KYB_DUMMY,KYB_LOWER ) ;
}
if ( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) { /* 上下段とも */
inst_change_up( KYB_UPPER,KYB_LOWER ) ;
}
/*
** 音色の変更( 1つ下の音色 )
*/
} else if ( KEY_test( matrix,KEY_DOWN ) ) {
if ( KEY_test( matrix,KEY_SHIFT ) ) { /* キーボード上段 */
inst_change_down( KYB_UPPER,KYB_DUMMY ) ;
}
if ( KEY_test( matrix,KEY_CTRL ) ) { /* キーボード下段 */
inst_change_down( KYB_DUMMY,KYB_LOWER ) ;
}
if ( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) { /* 上下段とも */
inst_change_down( KYB_UPPER,KYB_LOWER ) ;
}
/*
** 定位の変更( 1つ右の定位 )
*/
} else if ( KEY_test( matrix,KEY_RIGHT ) ) {
if ( KEY_test( matrix,KEY_SHIFT ) ) { /* キーボード上段 */
pan_change_right( KYB_UPPER,KYB_DUMMY ) ;
}
if ( KEY_test( matrix,KEY_CTRL ) ) { /* キーボード下段 */
pan_change_right( KYB_DUMMY,KYB_LOWER ) ;
}
if ( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) { /* 上下段とも */
pan_change_right( KYB_UPPER,KYB_LOWER ) ;
}
/*
** 定位の変更( 1つ左の定位 )
*/
} else if ( KEY_test( matrix,KEY_LEFT ) ) {
if ( KEY_test( matrix,KEY_SHIFT ) ) { /* キーボード上段 */
pan_change_left( KYB_UPPER,KYB_DUMMY ) ;
}
if ( KEY_test( matrix,KEY_CTRL ) ) { /* キーボード下段 */
pan_change_left( KYB_DUMMY,KYB_LOWER ) ;
}
if ( !KEY_test( matrix,KEY_SHIFT ) &&
!KEY_test( matrix,KEY_CTRL ) ) { /* 上下段とも */
pan_change_left( KYB_UPPER,KYB_LOWER ) ;
}
/*
** キーボード操作で音を出す
*/
} else {
note_change( matrix ) ; /* 音程の変更チェック */
for ( c=0; c<NKYBINF; c++ ) {
key_play( matrix,c ) ;
}
}
} while ( !KEY_test( matrix,KEY_BREAK ) ) ; /* BREAKキーが押されるまで */
}
/********************************* メイン **********************************/
void main( int ac, char *av[] )
{
int endp ;
printf("FMB.EXP v0.50 (c) パオパオ 1990. ") ;
printf("<< Copyright (C) Y.Hirata 1990. >>\n") ;
if ( ac > 1 ) { /* 引数あり */
strcpy( Fmbfile,av[1] ) ;
endp = strlen( Fmbfile ) ;
if ( strchr( Fmbfile,'.' ) == NULL ) { /* ファイル拡張子なし */
strcat( Fmbfile,".FMB" ) ;
} else {
if ( strcmp( Fmbfile+endp-4,".FMB" ) &&
strcmp( Fmbfile+endp-4,".fmb" ) ) {
printf("\x1b[31mERROR\x1b[m : FILE NAME ( %s ) - ",Fmbfile) ;
printf(".FMB ファイル しか指定できません!\n") ;
exit( 1 ) ;
}
}
} else { /* 引数なし */
strcpy( Fmbfile,FMB_FILE ) ;
}
INT23_init() ; /* ^C マスク設定 */
init() ; /* 各種初期設定 */
play_start() ; /* プレイ開始 */
close:
KYB_clic( 0 ) ; /* キークリック音あり */
KYB_clrbuf() ; /* キーバッファ・クリア */
SND_end() ; /* サウンド終了 */
INT23_end() ; /* ^C マスク解除 */
printf("\nプログラムを終了します。\n") ;
}