//--------------------------------------------------------------------------------------
// music音色クラス : 複数音色の管理
//--------------------------------------------------------------------------------------

#import "MusicTones.h"
#import "libs.h"

@implementation MusicTones

//----------------------------------------------------------

-(instancetype)init
{
	printSelf();
	self=[super init];
	if (self!=nil) {
		// 音色登録
		// Sでの指定は1〜なので[sno-1]になる
		// ループ音はどうしてもループするときに音が途切れてしまう。これを防ぐには、
		// (1)ループが不要な長さL1 T32の音長さ分＝7.5秒分*オクターブ8分のサンプリングデータを持ってくる(1オクターブ上がれば2倍)
		// (2)ループした時に完全につながるサンプリングデータ
		// を持ってくるしかない。ただ、(1)は非常に長くなる、(2)はアタック部が存在する楽器では無理である。
		// 例外的に、15のオルガンのような楽器ではこれができている。
		// 波形の途中からループ再生できる方法があればよいが、現状それがないので途切れをなくすことは難しい。
		// オクターブ別音データの用意については次以降のバージョンで。
		tone[ 1-1]=[[MusicTone1 alloc]initWithFile:@"01_APIANO_O4C_GRAN.M30"rate:0 		octave:4 scale:SCALE_C floop:NO]; // 音色1は未登録音への代替音色でもあるので絶対に設定すること
		tone[ 3-1]=[[MusicTone1 alloc]initWithFile:@"03_KB_O4C_EPIA.M30"  	rate:0 		octave:4 scale:SCALE_C floop:NO];
		tone[ 7-1]=[[MusicTone1 alloc]initWithFile:@"07_O4C_ACOU.M30" 		rate:0 		octave:4 scale:SCALE_C floop:NO];
		tone[ 8-1]=[[MusicTone1 alloc]initWithFile:@"08_O4C_ELEC.M30" 		rate:0 		octave:4 scale:SCALE_C floop:NO];
		tone[10-1]=[[MusicTone1 alloc]initWithFile:@"10_BASS_O3C_FPOP.M30"  rate:0 		octave:3 scale:SCALE_C floop:NO];
		tone[11-1]=[[MusicTone1 alloc]initWithFile:@"11_O4C_BANJ.M30"   	rate:0 		octave:4 scale:SCALE_C floop:NO];
		tone[12-1]=[[MusicTone1 alloc]initWithFile:@"12_SITAR3_A5.M44"      rate:0 		octave:5 scale:SCALE_A floop:NO];
		tone[14-1]=[[MusicTone1 alloc]initWithFile:@"14_O4C_KOTO.M30"	    rate:0 		octave:4 scale:SCALE_C floop:NO];
		tone[15-1]=[[MusicTone1 alloc]initWithFile:@"15_FORGAN1_A1.wav"	    rate:44100	octave:1 scale:SCALE_A floop:YES];
		tone[19-1]=[[MusicTone1 alloc]initWithFile:@"19_O4C_VIOL.wav"	    rate:44100	octave:4 scale:SCALE_C floop:YES];
		tone[21-1]=[[MusicTone1 alloc]initWithFile:@"21_STR_C4.wav"	        rate:44100	octave:4 scale:SCALE_C floop:YES];
		tone[22-1]=[[MusicTone1 alloc]initWithFile:@"22_STRINGS3_A3.wav"	rate:44100	octave:3 scale:SCALE_A floop:YES];
		tone[25-1]=[[MusicTone1 alloc]initWithFile:@"25_AHH_C4.wav"	        rate:44100	octave:4 scale:SCALE_C floop:YES];
		tone[33-1]=[[MusicTone1 alloc]initWithFile:@"33_SAX_C3.PCM"	        rate:15600	octave:3 scale:SCALE_C floop:YES];
		tone[34-1]=[[MusicTone1 alloc]initWithFile:@"34_O4C_TRUM.wav"	    rate:44100 	octave:4 scale:SCALE_C floop:YES];
		tone[35-1]=[[MusicTone1 alloc]initWithFile:@"35_O5C_FHOR.wav"	    rate:44100 	octave:5 scale:SCALE_C floop:YES];
		tone[36-1]=[[MusicTone1 alloc]initWithFile:@"36_O4C_TROM.wav"	    rate:44100 	octave:4 scale:SCALE_C floop:YES];
		tone[37-1]=[[MusicTone1 alloc]initWithFile:@"37_O4C_TUBA.wav"	    rate:44100 	octave:4 scale:SCALE_C floop:YES];
		tone[43-1]=[[MusicTone1 alloc]initWithFile:@"43_WHSTL.PCM"	     	rate:15600 	octave:4 scale:SCALE_C floop:NO];
		tone[45-1]=[[MusicTone1 alloc]initWithFile:@"45_SNARE2.PCM"	     	rate:15600 	octave:2 scale:SCALE_C floop:NO];
		tone[46-1]=[[MusicTone1 alloc]initWithFile:@"46_RIMS1.PCM"	     	rate:15600 	octave:4 scale:SCALE_C floop:NO];
		tone[48-1]=[[MusicTone1 alloc]initWithFile:@"48_TOM6.PCM"	     	rate:15600 	octave:3 scale:SCALE_C floop:NO];
		tone[49-1]=[[MusicTone1 alloc]initWithFile:@"49_TIMPANI.PCM"	    rate:15600 	octave:1 scale:SCALE_C floop:NO];
		tone[50-1]=[[MusicTone1 alloc]initWithFile:@"50_BONGO_H.PCM"	   	rate:15600 	octave:4 scale:SCALE_C floop:NO];
		tone[52-1]=[[MusicTone1 alloc]initWithFile:@"52_TRIANGLE.PCM"	    rate:15600 	octave:5 scale:SCALE_C floop:NO];
		tone[53-1]=[[MusicTone1 alloc]initWithFile:@"53_COWBELL1.PCM"	    rate:15600 	octave:4 scale:SCALE_C floop:NO];
		tone[55-1]=[[MusicTone1 alloc]initWithFile:@"55_STLDRM_L.PCM"	    rate:15600 	octave:2 scale:SCALE_C floop:NO];
		tone[58-1]=[[MusicTone1 alloc]initWithFile:@"58_O4C_MARI.M30"	    rate:0 		octave:4 scale:SCALE_C floop:NO];
		tone[59-1]=[[MusicTone1 alloc]initWithFile:@"59_HHC.PCM"	    	rate:15600 	octave:5 scale:SCALE_C floop:NO];
		tone[60-1]=[[MusicTone1 alloc]initWithFile:@"60_HHO.PCM"	   		rate:15600 	octave:3 scale:SCALE_C floop:NO];
		tone[66-1]=[[MusicTone1 alloc]initWithFile:@"66_BLASTER.M30"	   	rate:0 		octave:4 scale:SCALE_C floop:NO];
		// 空きは予約
	}
	return self;
}

//----------------------------------------------------------

// no : 音色番号 0〜
-(MusicTone1 *)getTone:(int)no
{
	return (tone[no]);
}

//----------------------------------------------------------

// no : 音色番号 0〜
-(BOOL)setFileToNo:(int)no path:(NSString *)path rate:(int)rate octave:(int)octave scale:(int)scale floop:(BOOL)floop
{
	BOOL ferror;
	tone[no]=nil; // 前のを開放
	tone[no]=[[MusicTone1 alloc]initWithFile:path rate:rate octave:octave scale:scale floop:floop ferror:&ferror];
	return ferror;
}

//----------------------------------------------------------

-(void)dealloc
{
	printSelf();
	// 音色データ開放
	for (int i=0;i<MML_TONES;i++) {
		if (tone[i]!=nil) {
			tone[i]=nil;
		}
	}
}

//----------------------------------------------------------

@end
