home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FreeWare Collection 3
/
FreeSoftwareCollection3pd199x-jp.img
/
pao
/
t_os
/
sound
/
src
/
snd.c
< prev
next >
Wrap
Text File
|
1980-01-02
|
21KB
|
765 lines
/*
** < High C V1.4 & 386ASM V2.0 >
**
** SND ファイルで音を出します。
**
** 1990.09.01 : CREATE
** 1990.09.01 : FINISH
**
** < HISTORY >
** 1990.09.01 : 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 <dos.h>
#include <msdos.cf>
#include "snd.h"
#define SworkSize 16384 /* サウンド用作業域サイズ */
char Swork[SworkSize]; /* サウンド用作業域 */
char Sndfile[128] ; /* PCM 音声ファイル */
int Sndsize ; /* PCM 音声データサイズ */
char *Snddata ; /* PCM 音声格納領域 */
char Sndflg = FALSE ; /* PCM 音声 READ フラグ */
int Inst1 = 0 ; /* キーボード上段用 */
int Inst2 = 0 ; /* キーボード下段用 */
int Pan1 = 64 ; /* キーボード上段 */
int Pan2 = 64 ; /* キーボード下段 */
int ValNote1 = 0 ; /* キーボード上段音程用 */
int ValNote2 = 0 ; /* キーボード下段音程用 */
struct _SND_DATA {
char name[8] ; /* サウンドネーム */
ulong sid ; /* サウンドID */
ulong len ; /* データ幅 */
ulong loop_p ; /* ループポイント */
ulong loop_len ; /* ループレングス */
ushort sf ; /* サンプリング周波数 */
short hosei ; /* 原音の補正(ピッチベンド) */
uchar onkai ; /* 原音の音階 */
uchar flg ; /* ?フラグ */
} ;
union _SND_CHECK {
struct _SND_DATA data ;
char buf[30] ;
} Snd ;
typedef struct {
char _reserved[21] ; /* reserved area */
char _attrib ; /* attribute byte */
ushort _ftime ; /* time of file */
ushort _fdate ; /* date of file */
ulong _fsize ; /* file size */
char d_name[13] ; /* packed file name */
} DIR ;
/************************* DTAの設定 ************************************/
void setdta( p )
DIR *p ;
{
Registers.AX.LH.H = 0x1a ;
Registers.DX.R = (uint)p ;
Registers.DS.R = getds() ;
calldos() ;
}
/******************* 最初に一致するファイル名の検索 ************************/
int firstsearch( path,attr,dta )
char *path ;
int attr ;
DIR *dta ;
{
setdta( dta ) ;
Registers.AX.LH.H = 0x4e ;
Registers.CX.R = attr ; /* ファイルの種類 */
Registers.DX.R = (uint)path ; /* ファイル名 */
Registers.DS.R = getds() ;
calldos();
if ( (Registers.Flags & 0x0001) != 0 )
return ( FALSE ) ;
else
return ( TRUE ) ; /* 成功ならば 真 でreturn */
}
/*************************** ファイルサイズ取得 ****************************/
int getfsize()
{
DIR dta ;
ushort attr=0 ;
if ( firstsearch( Sndfile,attr,&dta ) ) { /* 最初のエントリ */
Sndsize = dta._fsize ;
return( dta._fsize ) ;
} else { /* ファイルが見つからない */
return( -1 ) ;
}
}
/*************************** SND DATA の読込み *****************************/
void snd_load()
{
FILE *fp;
Sndflg = FALSE ;
if ( getfsize() == -1 ) return ;
Snddata = malloc( Sndsize ) ; /* SND データ格納領域確保 */
if ( Snddata == NULL ) {
printf("<snd_load> malloc error!\n") ;
return ;
} else {
fp = fopen( Sndfile,"rb" ) ;
fread( Snddata,1,Sndsize,fp ) ;
fclose( fp ) ;
Sndflg = TRUE ;
}
memcpy( Snd.buf,Snddata,30 ) ;
if ( !Sndflg ) {
printf("\x1b[33m") ;
printf(".SND ファイル ( %s ) を読み込めませんでした。\x1b[m\n",Sndfile) ;
return ;
} else {
printf("発音は、\x1b[36m%s \x1b[m",Sndfile) ;
printf("の音声データを使用します。\n") ;
}
printf("\n") ;
/*
** PCM 音声を初期設定する
*/
SND_pcm_mode_set( 8 ) ; /* PCM音声モードチャンネル数設定 */
SND_volume_change( 64,127 ) ; /* 各チャンネルを最大ボリュームにする*/
SND_volume_change( 65,127 ) ;
SND_volume_change( 66,127 ) ;
SND_volume_change( 67,127 ) ;
SND_volume_change( 68,127 ) ;
SND_volume_change( 69,127 ) ;
SND_volume_change( 70,127 ) ;
SND_volume_change( 71,127 ) ;
}
/******************************************************************************
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 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 == 96 ) {
Pan1 = 127 ;
} else {
Pan1 += 32 ;
}
/* PCM 音源の場合 :
000~007, 008~015, 016~023, 024~031, 032~039,
040~047, 048~055, 056~071, 072~079, 080~087,
088~095, 096~103, 104~111, 112~119, 120~127
の 15段階設定可能 */
/* しかし、ここでは 5段階にしている。 */
SND_pan_set( 64,Pan1 ) ;
SND_pan_set( 65,Pan1 ) ;
SND_pan_set( 66,Pan1 ) ;
SND_pan_set( 67,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 == 96 ) {
Pan2 = 127 ;
} else {
Pan2 += 32 ;
}
/* PCM 音源の場合 :
000~007, 008~015, 016~023, 024~031, 032~039,
040~047, 048~055, 056~071, 072~079, 080~087,
088~095, 096~103, 104~111, 112~119, 120~127
の 15段階設定可能 */
/* しかし、ここでは 5段階にしている。 */
SND_pan_set( 68,Pan2 ) ;
SND_pan_set( 69,Pan2 ) ;
SND_pan_set( 70,Pan2 ) ;
SND_pan_set( 71,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 = 96 ;
} else {
Pan1 -= 32 ;
}
/* PCM 音源の場合 :
000~007, 008~015, 016~023, 024~031, 032~039,
040~047, 048~055, 056~071, 072~079, 080~087,
088~095, 096~103, 104~111, 112~119, 120~127
の 15段階設定可能 */
/* しかし、ここでは 5段階にしている。 */
SND_pan_set( 64,Pan1 ) ;
SND_pan_set( 65,Pan1 ) ;
SND_pan_set( 66,Pan1 ) ;
SND_pan_set( 67,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 = 96 ;
} else {
Pan2 -= 32 ;
}
/* PCM 音源の場合 :
000~007, 008~015, 016~023, 024~031, 032~039,
040~047, 048~055, 056~071, 072~079, 080~087,
088~095, 096~103, 104~111, 112~119, 120~127
の 15段階設定可能 */
/* しかし、ここでは 5段階にしている。 */
SND_pan_set( 68,Pan2 ) ;
SND_pan_set( 69,Pan2 ) ;
SND_pan_set( 70,Pan2 ) ;
SND_pan_set( 71,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()
{
printf("\nキーボードを操作すると、SND ファイルの音色で演奏できます♪\n") ;
printf("\n8重和音まで対応しています♪\n") ;
printf("カーソルキーの右左で定位を変更できます♪") ;
printf(" ( SHIFT+ で上段のみ, CTRL+ で下段のみ )\n") ;
printf("PFキーで、音程を変更できます♪ ( PF1 ~ PF9 : PF5 が標準 )\n") ;
printf("取消キーで、全ての発音を停止できます。\n") ;
printf("改行キーで、SNDファイルの再生を行います♪\n") ;
printf("終了は、") ;
printf("\x1b[36mBREAKキー\x1b[m") ;
printf(" です!\n") ;
SND_init( Swork ) ; /* サウンド初期化 */
printf("\n") ;
snd_load() ;
SND_elevol_mute( 0x0001 ) ; /* PCM 音源のみミュート解除*/
SND_elevol_all_mute( -1 ) ; /* 全ミュートの解除 */
KYB_clic( 1 ) ; /* キークリック音なし */
if ( Sndflg ) {
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 : キーアドレス */
{
/* PCM のチャンネルは 64 ~ 71 */
static int chan1=64 ; /* キーボード上段のチャンネル */
static int chan2=68 ; /* キーボード下段のチャンネル */
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 > 67 ) chan1 = 64 ;
if ( chan2 > 71 ) chan2 = 68 ;
if ( keyadrs == KEY_CR ) {
if ( KEY_test( matrix,keyadrs ) ) { /* キー MAKE */
if ( !keymake[keyadrs] ) { /* キー BREAK -> MAKE */
printf("\n< %s > の再生を行います♪ (NOTE=%d)\n",
Sndfile,Snd.data.onkai) ;
SND_pcm_play_stop( 71 ) ;
SND_pcm_play( 71,Snd.data.onkai,127,Snddata ) ;
keymake[keyadrs] = TRUE ;
}
} else { /* キー BREAK */
keymake[keyadrs] = FALSE ;
}
return ;
}
if ( Key_inf[keyadrs] == KYB_UPPER ) { /* キーボード 上段 */
if ( KEY_test( matrix,keyadrs ) ) { /* キー MAKE */
if ( !keymake[keyadrs] ) { /* キー BREAK -> MAKE */
SND_pcm_play_stop( chan1 ) ;
ret = SND_pcm_play( chan1,Key_note[keyadrs]+ValNote1,127,
Snddata ) ;
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_pcm_play_stop( channel[keyadrs] ) ;
keymake[keyadrs] = FALSE ;
}
} else if ( Key_inf[keyadrs] == KYB_LOWER ) { /* キーボード 下段 */
if ( KEY_test( matrix,keyadrs ) ) { /* キー MAKE */
if ( !keymake[keyadrs] ) { /* キー BREAK -> MAKE */
SND_pcm_play_stop( chan2 ) ;
ret = SND_pcm_play( chan2,Key_note[keyadrs]+ValNote2,127,
Snddata ) ;
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_pcm_play_stop( 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_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 if ( KEY_test( matrix,KEY_UNDO ) ) {
SND_pcm_abort() ;
/*
** キーボード操作で音を出す
*/
} 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("SND.EXP v0.50 (c) パオパオ 1990. ") ;
printf("<< Copyright (C) Y.Hirata 1990. >>\n") ;
if ( ac > 1 ) { /* 引数あり */
strcpy( Sndfile,av[1] ) ;
endp = strlen( Sndfile ) ;
if ( strchr( Sndfile,'.' ) == NULL ) { /* ファイル拡張子なし */
strcat( Sndfile,".SND" ) ;
} else {
if ( strcmp( Sndfile+endp-4,".SND" ) &&
strcmp( Sndfile+endp-4,".snd" ) ) {
printf("\x1b[31mERROR\x1b[m : FILE NAME ( %s ) - ",Sndfile) ;
printf(".SND ファイル しか指定できません!\n") ;
exit( 1 ) ;
}
}
} else { /* 引数なし */
printf(".SND ファイルを指定して下さい。\n") ;
exit( 1 ) ;
}
INT23_init() ; /* ^C マスク設定 */
init() ; /* 各種初期設定 */
if ( Sndflg )
play_start() ; /* プレイ開始 */
close:
if ( Sndflg ) {
free( Snddata ) ;
}
KYB_clic( 0 ) ; /* キークリック音あり */
KYB_clrbuf() ; /* キーバッファ・クリア */
SND_end() ; /* サウンド終了 */
INT23_end() ; /* ^C マスク解除 */
printf("\nプログラムを終了します。\n") ;
}