twl_wrapsdk/build/tests/snd/channel/ARM9/src/main.c
kamikawa bfc9350270 libraries/snd/ARM7/src/snd_mic.c で定義されていたマイク関数を削除し、新規にlibralies/mic 関数を追加。
CODEC関連コードを更新。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/twl_wrapsdk/trunk@287 4ee2a332-4b2b-5046-8439-1ba90f034370
2007-09-28 10:35:18 +00:00

176 lines
5.8 KiB
C

/*---------------------------------------------------------------------------*
Project: TwlSDK - SND - tests - channel
File: main.c
Copyright 2007 Nintendo. All rights reserved.
These coded instructions, statements, and computer programs contain
proprietary information of Nintendo of America Inc. and/or Nintendo
Company Ltd., and are protected by Federal copyright law. They may
not be disclosed to third parties or copied or duplicated in any form,
in whole or in part, without the prior written consent of Nintendo.
$Log: main.c,v $
$NoKeywords: $
*---------------------------------------------------------------------------*/
#include <twl.h>
#include "organ_det.g3.pcm16.h"
#include "wihaho.pcm16.h"
// PSGの周波数を計算するマクロ
#define FreqToTimer(freq) (SND_TIMER_CLOCK / ( 8 * (freq) ))
#define KeyToTimer(key) (SND_CalcTimer(FreqToTimer(440), ((key)-69)*64))
#define PCM_PLAY_CHANNEL1 4
#define PCM_PLAY_CHANNEL2 5
#define PSG_PLAY_CHANNEL 8
#define NOISE_PLAY_CHANNEL 14
#define CENTER_PAN 64
u16 Cont;
u16 Trg;
u8 key = 60;
void VBlankIntr(void);
/*---------------------------------------------------------------------------*
Name: TwlMain
Description: main
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void TwlMain()
{
OS_InitPrintServer();
// 初期化
OS_Init();
GX_Init();
SND_Init();
// Vブランク割り込み設定
OS_SetIrqFunction(OS_IE_V_BLANK, VBlankIntr);
(void)OS_EnableIrqMask(OS_IE_V_BLANK);
(void)OS_EnableIrq();
(void)GX_VBlankIntr(TRUE);
// print usage
OS_Printf("=================================\n");
OS_Printf("USAGE:\n");
OS_Printf(" A, B, X, Y : start sound\n");
OS_Printf(" START : stop sound\n");
OS_Printf("=================================\n");
// チャンネルをロックする
SND_LockChannel((1 << PCM_PLAY_CHANNEL1) | (1 << PCM_PLAY_CHANNEL2) | (1 << PSG_PLAY_CHANNEL) |
(1 << NOISE_PLAY_CHANNEL), 0);
while (1)
{
u16 ReadData;
OS_WaitVBlankIntr();
// ARM7コマンド応答受信
while (SND_RecvCommandReply(SND_COMMAND_NOBLOCK) != NULL)
{
}
ReadData = PAD_Read();
Trg = (u16)(ReadData & (ReadData ^ Cont));
Cont = ReadData;
// PCM再生
if (Trg & PAD_BUTTON_A)
{
OS_Printf("A\n");
SND_SetupChannelPcm(PCM_PLAY_CHANNEL1,
ORGAN_DET_G3_PCM16_FORMAT,
organ_det_g3_pcm16,
ORGAN_DET_G3_PCM16_LOOPFLAG ? SND_CHANNEL_LOOP_REPEAT :
SND_CHANNEL_LOOP_1SHOT, ORGAN_DET_G3_PCM16_LOOPSTART,
ORGAN_DET_G3_PCM16_LOOPLEN, 127, SND_CHANNEL_DATASHIFT_NONE,
SND_CalcTimer(ORGAN_DET_G3_PCM16_TIMER, ((key) - 67) * 64),
CENTER_PAN);
SND_StartTimer(1 << PCM_PLAY_CHANNEL1, 0, 0, 0);
}
if (Trg & PAD_BUTTON_B)
{
OS_Printf("B\n");
SND_SetupChannelPcm(PCM_PLAY_CHANNEL2,
WIHAHO_PCM16_FORMAT,
wihaho_pcm16,
WIHAHO_PCM16_LOOPFLAG ? SND_CHANNEL_LOOP_REPEAT :
SND_CHANNEL_LOOP_1SHOT, WIHAHO_PCM16_LOOPSTART,
WIHAHO_PCM16_LOOPLEN, 127, SND_CHANNEL_DATASHIFT_NONE,
WIHAHO_PCM16_TIMER, CENTER_PAN);
SND_StartTimer(1 << PCM_PLAY_CHANNEL2, 0, 0, 0);
}
// PSG矩形波を再生
if (Trg & PAD_BUTTON_X)
{
OS_Printf("X\n");
SND_SetupChannelPsg(PSG_PLAY_CHANNEL,
SND_DUTY_4_8,
64, SND_CHANNEL_DATASHIFT_NONE, KeyToTimer(key), CENTER_PAN);
SND_StartTimer(1 << PSG_PLAY_CHANNEL, 0, 0, 0);
}
// ノイズの再生
if (Trg & PAD_BUTTON_Y)
{
OS_Printf("Y\n");
SND_SetupChannelNoise(NOISE_PLAY_CHANNEL,
64, SND_CHANNEL_DATASHIFT_NONE, KeyToTimer(key), CENTER_PAN);
SND_StartTimer(1 << NOISE_PLAY_CHANNEL, 0, 0, 0);
}
// 停止
if (Trg & PAD_BUTTON_START)
{
SND_StopTimer((1 << PCM_PLAY_CHANNEL1) | (1 << PCM_PLAY_CHANNEL2) |
(1 << PSG_PLAY_CHANNEL) | (1 << NOISE_PLAY_CHANNEL), 0, 0, 0);
}
// 再生のキーを半音上げる
if (Trg & PAD_KEY_UP)
{
key++;
SND_SetChannelTimer(1 << PCM_PLAY_CHANNEL1,
SND_CalcTimer(ORGAN_DET_G3_PCM16_TIMER, ((key) - 67) * 64));
SND_SetChannelTimer((1 << PSG_PLAY_CHANNEL) | (1 << NOISE_PLAY_CHANNEL),
KeyToTimer(key));
OS_Printf("key: %d\n", key);
}
// 再生のキーを半音下げる
if (Trg & PAD_KEY_DOWN)
{
key--;
SND_SetChannelTimer(1 << PCM_PLAY_CHANNEL1,
SND_CalcTimer(ORGAN_DET_G3_PCM16_TIMER, ((key) - 67) * 64));
SND_SetChannelTimer((1 << PSG_PLAY_CHANNEL) | (1 << NOISE_PLAY_CHANNEL),
KeyToTimer(key));
OS_Printf("key: %d\n", key);
}
// コマンドフラッシュ
(void)SND_FlushCommand(SND_COMMAND_NOBLOCK);
}
}
//--------------------------------------------------------------------------------
// Vブランク割り込み処理
//
void VBlankIntr(void)
{
OS_SetIrqCheckFlag(OS_IE_V_BLANK); // checking VBlank interrupt
}