1 /*
2     TiMidity++ -- MIDI to WAVE converter and player
3     Copyright (C) 1999-2002 Masanao Izumo <mo@goice.co.jp>
4     Copyright (C) 1995 Tuukka Toivonen <tt@cgs.fi>
5 
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10 
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15 
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 
20 	Macintosh interface for TiMidity
21 	by T.Nogami	<t-nogami@happy.email.ne.jp>
22 
23     mac_dlog.c
24     Preference dialog
25 */
26 
27 #ifdef HAVE_CONFIG_H
28 #include "config.h"
29 #endif /* HAVE_CONFIG_H */
30 #include	<stdio.h>
31 #include	<stdlib.h>
32 #include	<string.h>
33 
34 #include	"timidity.h"
35 #include	"instrum.h"
36 #include	"playmidi.h"
37 #include	"output.h"
38 #include	"readmidi.h"
39 #include	"reverb.h"
40 
41 #include	"mac_main.h"
42 #include	"mac_util.h"
43 
44 extern int effect_lr_mode;
45 
46 
mac_DefaultOption()47 void mac_DefaultOption()
48 {
49 	play_mode->rate=DEFAULT_RATE;
50 	play_mode->encoding &= ~PE_MONO;	/*stereo*/
51 	/*play_mode->encoding |= PE_MONO;*/	/*mono*/
52 
53 	antialiasing_allowed=0;
54 	fast_decay=0;
55 	adjust_panning_immediately=0;
56 	free_instruments_afterwards=1;	/*option -U*/
57 
58 	voices=DEFAULT_VOICES;
59 	control_ratio = play_mode->rate/CONTROLS_PER_SECOND;
60 	gSilentSec=3.0;
61 	mac_LogWindow.show=mac_ListWindow.show=true;
62 	mac_WrdWindow.show=mac_DocWindow.show=
63 		mac_SpecWindow.show=mac_TraceWindow.show=false;
64 	gShuffle=false;
65 
66 	opt_modulation_wheel = 1;
67 	opt_portamento = 1;
68 	opt_nrpn_vibrato = 1;
69 #ifdef REVERB_CONTROL_ALLOW
70 	opt_reverb_control = 1;
71 #else
72 	opt_reverb_control = 0;
73 #endif
74 #ifdef CHORUS_CONTROL_ALLOW
75 	opt_chorus_control = 1;
76 #else
77 	opt_chorus_control = 0;
78 #endif
79 	opt_surround_chorus = 0;
80 	opt_channel_pressure = 0;
81 	opt_trace_text_meta_event = 0;
82 	opt_overlap_voice_allow = 1;
83 
84 	effect_lr_mode=-1; //no effect
85 	modify_release=0;
86 	opt_default_mid=0x7e; //GM
87 
88 	readmidi_wrd_mode=1;
89 
90 	evil_level=EVIL_NORMAL;
91 	do_initial_filling=0;
92 	reduce_voice_threshold = 0;
93 	auto_reduce_polyphony = 0;
94 }
95 
96 enum{iOK=1, iCancel=2, iDefault=3, iRate=5, iMono=6, iStereo=7,
97 			iFreeInstr=8, iAntiali=9, iFastDecay=10, iAdjustPanning=11,
98 			iVoices=13, iControlRaio=15, iSilent=18,
99 
100 			iModulation_wheel = 21,
101 			iPortamento = 22,
102 			iNrpn_vibrato = 23,
103 
104 			iReverb = 24,
105 			iReverb_setlevel = 38,
106 			iReverb_level = 39,
107 			iReverb_level_hint = 42,
108 
109 			iChorus = 25,
110 			iChorus_setlevel = 40,
111 			iChorus_level = 41,
112 			iChorus_level_hint = 43,
113 
114 			iChannel_pressure = 26,
115 			iText_meta_event = 27,
116 			iOverlap_voice = 28,
117 			/*iPReverb = 29,*/
118 
119 			iModify_release=31,
120 			iModify_release_ms=37,
121 			iModify_release_ms_hint1=30,
122 			iModify_release_ms_hint2=44,
123 			iModify_release_ms_hint3=45,
124 
125 			iPresence_balance=32,
126 			iManufacture=33,
127 			iEvil_level=34,
128 			/*iDo_initial_filling=35,*/
129 			iShuffle= 36
130 			};
131 
132 // ******************************************
133 
mac_AdjustDialog(DialogRef dialog)134 static void mac_AdjustDialog( DialogRef dialog )
135 {
136 	//reverb
137 	if( GetDialogItemValue(dialog, iReverb)==2 ){
138 		SetDialogItemHilite(dialog, iReverb_setlevel, kControlNoPart);
139 	}else{
140 		SetDialogItemHilite(dialog, iReverb_setlevel, kControlInactivePart);
141 		SetDialogItemValue(dialog, iReverb_setlevel, 0);
142 	}
143 
144 	if( GetDialogItemValue(dialog, iReverb_setlevel) )
145 	{
146 		ShowDialogItem(dialog, iReverb_level);
147 		ShowDialogItem(dialog, iReverb_level_hint);
148 	}else{
149 		HideDialogItem(dialog, iReverb_level);
150 		HideDialogItem(dialog, iReverb_level_hint);
151 	}
152 	//chorus
153 	if( GetDialogItemValue(dialog, iChorus)==2 ){
154 		// activate
155 		SetDialogItemHilite(dialog, iChorus_setlevel, kControlNoPart);
156 		mySetDialogItemText(dialog, iChorus_level_hint, "\p(1..127)");
157 	}else if( GetDialogItemValue(dialog, iChorus)==3 ){
158 		// activate
159 		SetDialogItemHilite(dialog, iChorus_setlevel, kControlNoPart);
160 		mySetDialogItemText(dialog, iChorus_level_hint, "\p(1..63)");
161 	}else{	// inactivate
162 		SetDialogItemHilite(dialog, iChorus_setlevel, kControlInactivePart);
163 		SetDialogItemValue(dialog, iChorus_setlevel, 0);
164 	}
165 
166 	if( GetDialogItemValue(dialog, iChorus_setlevel) )
167 	{
168 		ShowDialogItem(dialog, iChorus_level);
169 		ShowDialogItem(dialog, iChorus_level_hint);
170 	}else{
171 		HideDialogItem(dialog, iChorus_level);
172 		HideDialogItem(dialog, iChorus_level_hint);
173 	}
174 
175 	// modify release
176 	if( GetDialogItemValue(dialog, iModify_release) )
177 	{
178 		ShowDialogItem(dialog, iModify_release_ms);
179 		ShowDialogItem(dialog, iModify_release_ms_hint1);
180 		ShowDialogItem(dialog, iModify_release_ms_hint2);
181 		ShowDialogItem(dialog, iModify_release_ms_hint3);
182 	}else{
183 		HideDialogItem(dialog, iModify_release_ms);
184 		HideDialogItem(dialog, iModify_release_ms_hint1);
185 		HideDialogItem(dialog, iModify_release_ms_hint2);
186 		HideDialogItem(dialog, iModify_release_ms_hint3);
187 	}
188 }
189 
190 // ***************************************************
191 
SetDialogValue(DialogRef theDialog)192 static void SetDialogValue(DialogRef theDialog)
193 {
194 #define BUFSIZE 80
195 	short	value;
196 	char	buf[BUFSIZE];
197 	Str255		s;
198 
199 	SetDialogItemValue(theDialog, iStereo, !(play_mode->encoding & PE_MONO));
200 	SetDialogItemValue(theDialog, iMono, play_mode->encoding & PE_MONO);
201 	value=(play_mode->rate==11025? 1:(play_mode->rate==44100? 3:2));
202 	SetDialogItemValue(theDialog, iRate, value);
203 	SetDialogItemValue(theDialog, iFreeInstr, free_instruments_afterwards);
204 	SetDialogItemValue(theDialog, iAntiali, antialiasing_allowed);
205 	SetDialogItemValue(theDialog, iFastDecay, fast_decay);
206 	SetDialogItemValue(theDialog, iAdjustPanning, adjust_panning_immediately);
207 	NumToString(voices, s);
208 	mySetDialogItemText(theDialog, iVoices, s);
209 	SelectDialogItemText(theDialog, iVoices, 0, 32000);
210 	NumToString(control_ratio, s);
211 	mySetDialogItemText(theDialog, iControlRaio, s);
212 	snprintf(buf, BUFSIZE, "%g",gSilentSec); /*use s as C string*/
213 	mySetDialogItemText(theDialog, iSilent, c2pstr(buf));
214 
215 	SetDialogItemValue(theDialog, iFastDecay, fast_decay);
216 
217 	SetDialogItemValue(theDialog, iModulation_wheel, opt_modulation_wheel);
218 	SetDialogItemValue(theDialog, iPortamento, opt_portamento);
219 	SetDialogItemValue(theDialog, iNrpn_vibrato, opt_nrpn_vibrato);
220 	SetDialogItemValue(theDialog, iChannel_pressure, opt_channel_pressure);
221 	SetDialogItemValue(theDialog, iText_meta_event, opt_trace_text_meta_event);
222 	SetDialogItemValue(theDialog, iOverlap_voice, opt_overlap_voice_allow);
223 
224 	/*-----reverb-----*/
225 	if( opt_reverb_control<0 ){ //Enabel
226 		SetDialogItemValue(theDialog, iReverb, 2);
227 		SetDialogItemValue(theDialog, iReverb_setlevel, 1);
228 		SetDialogItemHilite(theDialog, iReverb_setlevel, kControlNoPart);
229 		SetDialogTEValue(theDialog, iReverb_level, -opt_reverb_control);
230 
231 	}else if( opt_reverb_control==0 || opt_reverb_control==2 ){ //Non or global
232 		SetDialogItemValue(theDialog, iReverb, opt_reverb_control+1);
233 		SetDialogItemValue(theDialog, iReverb_setlevel, 1);
234 		SetDialogItemHilite(theDialog, iReverb_setlevel, kControlInactivePart);
235 	}else{	// opt_reverb_control==1, no level
236 		SetDialogItemValue(theDialog, iReverb, 2);
237 		SetDialogItemValue(theDialog, iReverb_setlevel, 0);
238 		SetDialogItemHilite(theDialog, iReverb_setlevel, kControlNoPart);
239 	}
240 
241 	/*-----chorus-----*/
242 	if( opt_surround_chorus ){
243 		SetDialogItemValue(theDialog, iChorus, 3); //surround
244 	}else if( opt_chorus_control<0 || opt_chorus_control==1 ){
245 		SetDialogItemValue(theDialog, iChorus, 2); //Enable
246 		SetDialogItemHilite(theDialog, iChorus_setlevel, kControlNoPart);
247 	}else{
248 		SetDialogItemValue(theDialog, iChorus, 1); //Non
249 		SetDialogItemHilite(theDialog, iChorus_setlevel, kControlInactivePart);
250 	}
251 
252 	if( opt_chorus_control<0 ){
253 		SetDialogItemHilite(theDialog, iChorus_setlevel, kControlNoPart);
254 		SetDialogItemValue(theDialog, iChorus_setlevel, 1);
255 		SetDialogTEValue(theDialog, iChorus_level, -opt_chorus_control);
256 	}else{
257 		SetDialogItemValue(theDialog, iChorus_setlevel, 0);
258 	}
259 
260 	/*-----modify_release-----*/
261 	SetDialogItemValue(theDialog, iModify_release,  (modify_release!=0) );
262 	SetDialogTEValue(theDialog, iModify_release_ms, modify_release);
263 
264 	SetDialogItemValue(theDialog, iPresence_balance, effect_lr_mode+2);
265 	value= (	opt_default_mid==0x41? 1:           //GS
266 				opt_default_mid==0x43? 2:3	);		//XG:GM
267 	SetDialogItemValue(theDialog, iManufacture, value);
268 	SetDialogItemValue(theDialog, iEvil_level, evil_level);
269 	//SetDialogItemValue(theDialog, iDo_initial_filling, do_initial_filling);
270 	SetDialogItemValue(theDialog, iShuffle, gShuffle);
271 
272 	mac_AdjustDialog( theDialog );
273 }
274 
mac_limit_params(int var,int min_limit,int max_limit)275 static int mac_limit_params(int var, int min_limit, int max_limit)
276 {
277 	if( var < min_limit ) var = min_limit;
278 	if( var > max_limit ) var = max_limit;
279 	return var;
280 }
281 
282 
283 // *******************************************
284 //	mac_SetPlayOption
285 // *******************************************
mac_SetPlayOption()286 OSErr mac_SetPlayOption()
287 {
288 	Boolean		more=false;
289 	short		item, value;
290 	long		i;
291 	DialogRef	dialog, theDialog;
292 	EventRecord	event;
293 	Str255		s;
294 
295 	theDialog=GetNewDialog(201,0,(WindowRef)-1);
296 
297 	if( !theDialog ) return 1;
298 	else
299 	{
300 		SetDialogDefaultItem(theDialog, iOK);
301 		SetDialogCancelItem(theDialog, iCancel);
302 
303 		SetDialogValue(theDialog);
304 		ShowWindow(GetDialogWindow(theDialog));
305 
306 		for(;;)
307 		{
308 			WaitNextEvent(everyEvent, &event, 1,0);
309 			/*if( event.what==mouseDown ){
310 				short		part;
311 				WindowRef	window;
312 				part = FindWindow(event.where, &window);
313 				if( part==inDrag ){
314 					DragWindow(window, event.where, &qd.screenBits.bounds);
315 					continue;
316 				}
317 			}else if(event.what==)
318 			*/
319 			if( IsDialogEvent( &event ) )
320 			{
321 				if( StdFilterProc(dialog, &event, &item) ) /**/;
322 					else DialogSelect(&event, &dialog, &item);
323 
324 				if( theDialog!=dialog ) continue;
325 				switch(item)
326 				{
327 				case iOK:
328 					myGetDialogItemText(dialog, iVoices, s);
329 					StringToNum(s,&i);
330 					if( i<=0 ) i=1;
331 					max_voices=MAX_SAFE_MALLOC_SIZE / sizeof(Voice);
332 					if ( i<max_voices ) max_voices=i;
333 					voices=max_voices;
334 
335 					myGetDialogItemText(dialog, iControlRaio, s);
336 					StringToNum(s,&i);
337 					if( i<=0 ) i=22; /*i=1 cause ploblem*/
338 					if( MAX_CONTROL_RATIO<i ) i=MAX_CONTROL_RATIO;
339 					control_ratio=i;
340 
341 					myGetDialogItemText(dialog, iSilent, s);
342 					gSilentSec=atof(p2cstr(s));
343 					if( gSilentSec<0 ) gSilentSec=0;
344 					if( gSilentSec>10 ) gSilentSec=10;
345 
346 					if( GetDialogItemValue(dialog, iMono) )
347 						play_mode->encoding |= PE_MONO;
348 					else play_mode->encoding &= ~PE_MONO;
349 
350 					if( (value=GetDialogItemValue(dialog, iRate))==1 )	play_mode->rate=11025;
351 					else if( value==2 ) play_mode->rate=22050;
352 					else if( value==3 ) play_mode->rate=44100;
353 					else play_mode->rate=22050;
354 
355 					free_instruments_afterwards=GetDialogItemValue(dialog, iFreeInstr)? 1:0;
356 					antialiasing_allowed=		GetDialogItemValue(dialog, iAntiali)? 1:0;
357 					fast_decay=					GetDialogItemValue(dialog, iFastDecay)? 1:0;
358 					adjust_panning_immediately=	GetDialogItemValue(dialog, iAdjustPanning)? 1:0;
359 
360 					opt_modulation_wheel=		GetDialogItemValue(dialog, iModulation_wheel)? 1:0;
361 					opt_portamento=				GetDialogItemValue(dialog, iPortamento)? 1:0;
362 					opt_nrpn_vibrato=			GetDialogItemValue(dialog, iNrpn_vibrato)? 1:0;
363 					opt_channel_pressure=		GetDialogItemValue(dialog, iChannel_pressure)? 1:0;
364 					opt_trace_text_meta_event=	GetDialogItemValue(dialog, iText_meta_event)? 1:0;
365 					opt_overlap_voice_allow=	GetDialogItemValue(dialog, iOverlap_voice)? 1:0;
366 
367 					/*-----reverb-----*/
368 					switch(GetDialogItemValue(dialog, iReverb))
369 					{
370 					  case 1:
371 					    opt_reverb_control = 0;
372 					    break;
373 					  case 2:
374 					    if(GetDialogItemValue(dialog, iReverb_setlevel))
375 						opt_reverb_control =
376 							- (mac_limit_params( GetDialogTEValue( dialog, iReverb_level ), 1, 127));
377 					    else
378 						opt_reverb_control = 1;
379 					    break;
380 					  case 3:
381 					    opt_reverb_control = 2;
382 					    break;
383 					  /*default:
384 					    ctl->cmsg(CMSG_ERROR, VERB_NORMAL,
385 						      "Invalid -EFreverb parameter.");*/
386 					}
387 
388 					/*-----chorus-----*/
389 					opt_surround_chorus = 0;
390 					switch(GetDialogItemValue(dialog, iChorus))
391 					{
392 					  case 1:
393 					    opt_chorus_control = 0;
394 					    break;
395 
396 					  case 2:
397 					    if( GetDialogItemValue(dialog, iChorus_setlevel) )
398 						opt_chorus_control =
399 							- (mac_limit_params( GetDialogTEValue(dialog,iChorus_level), 1, 127 ) );
400 					    else
401 						opt_chorus_control = 1;
402 					    break;
403 					  case 3:
404 						opt_surround_chorus = 1;
405 					    	if( GetDialogItemValue(dialog, iChorus_setlevel) )
406 							opt_chorus_control =
407 								- (mac_limit_params( GetDialogTEValue(dialog,iChorus_level), 1,63));
408 					  	else
409 							opt_chorus_control = 1;
410 						break;
411 					  /*default:
412 					    ctl->cmsg(CMSG_ERROR, VERB_NORMAL,
413 						      "Invalid -EFchorus parameter.");
414 					    return 1;*/
415 					}
416 
417 					modify_release=0;
418 					if( GetDialogItemValue(dialog, iModify_release) ){
419 						modify_release=GetDialogTEValue(dialog, iModify_release_ms);
420 						modify_release = mac_limit_params(modify_release, 0, 5000);
421 					}
422 					effect_lr_mode=	GetDialogItemValue(dialog, iPresence_balance)-2;
423 					value=GetDialogItemValue(dialog, iManufacture);
424 					opt_default_mid= 	(value==1? 0x41:		//GS
425 										 value==2? 0x43:0x7e);	//XG:GM
426 					evil_level= 		GetDialogItemValue(dialog, iEvil_level);
427 					//do_initial_filling=	GetDialogItemValue(dialog, iDo_initial_filling)? 1:0;
428 					gShuffle=			GetDialogItemValue(dialog, iShuffle)? 1:0;
429 
430 					DisposeDialog(theDialog);
431 					return noErr;
432 				case iCancel:
433 					DisposeDialog(theDialog);
434 					return 1;
435 				case iDefault:
436 					mac_DefaultOption();
437 					SetDialogValue(theDialog);
438 					break;
439 /*				case iMore:
440 					if( !more )
441 					{
442 						SizeWindow(GetDialogWindow(theDialog), 400, 300, 1);
443 						SetDialogControlTitle(theDialog,iMore, "\pFew...");
444 						more=true;
445 					}
446 					else
447 					{
448 						SizeWindow(GetDialogWindow(theDialog), 400, 160, 1);
449 						SetDialogControlTitle(theDialog,iMore, "\pMore...");
450 						more=false;
451 					}
452 */
453 					break;
454 				case iRate:
455 					break;
456 				case iMono:
457 					SetDialogItemValue(dialog, iMono, 1);
458 					SetDialogItemValue(dialog, iStereo, 0);
459 					break;
460 				case iStereo:
461 					SetDialogItemValue(dialog, iStereo, 1);
462 					SetDialogItemValue(dialog, iMono, 0);
463 					break;
464 				case iFreeInstr:	ToggleDialogItem(dialog, iFreeInstr);	break;
465 				case iAntiali:		ToggleDialogItem(dialog, iAntiali);		break;
466 				case iFastDecay:	ToggleDialogItem(dialog, iFastDecay);	break;
467 				case iAdjustPanning:ToggleDialogItem(dialog, iAdjustPanning); break;
468 
469 				case iModulation_wheel:	ToggleDialogItem(dialog, iModulation_wheel);	break;
470 				case iPortamento:		ToggleDialogItem(dialog, iPortamento);	break;
471 				case iNrpn_vibrato:		ToggleDialogItem(dialog, iNrpn_vibrato);	break;
472 				case iChannel_pressure:	ToggleDialogItem(dialog, iChannel_pressure);	break;
473 				case iText_meta_event:	ToggleDialogItem(dialog, iText_meta_event);	break;
474 				case iOverlap_voice:	ToggleDialogItem(dialog, iOverlap_voice);	break;
475 
476 				case iReverb:
477 					mac_AdjustDialog(dialog);
478 					break;
479 				case iReverb_setlevel:
480 					ToggleDialogItem(dialog, iReverb_setlevel);
481 					mac_AdjustDialog(dialog);
482 					break;
483 				case iChorus:
484 					mac_AdjustDialog(dialog);
485 					break;
486 
487 				case iChorus_setlevel:
488 					ToggleDialogItem(dialog, iChorus_setlevel);
489 					mac_AdjustDialog(dialog);
490 					break;
491 				case iModify_release:
492 					ToggleDialogItem(dialog, iModify_release);
493 					if( GetDialogItemValue(dialog, iModify_release) ){ //newly checked on
494 						SetDialogTEValue(theDialog, iModify_release_ms, DEFAULT_MREL);
495 					}
496 					mac_AdjustDialog(dialog);
497 					break;
498 				case iShuffle:			ToggleDialogItem(dialog, iShuffle);	break;
499 				}
500 			}
501 		}
502 	}
503 }
504 
505 /* ****************************************************** */
506 struct{
507 	int		version;
508 	short	playerX,playerY,
509 			logX, logY,
510 			logW, logH,
511 			listX, listY,
512 			listW, listH,
513 			docX,  docY,
514 			docW,  docH,
515 			specX, specY,
516 			traceX, traceY, wrdX,wrdY, skinX,skinY;
517 	int		rate;
518 	char	mono, freeinstrument, antialias, fastdecay, adjustpanning;
519 	int		voice;
520 	short	amplitude;
521 	int32	controlratio;
522 	double	silentsec;
523 	int32	modify_release;
524 	int		effect_lr_mode;
525 	int		opt_default_mid;
526 	int		showMsg, showList, showWrd, showDoc, showSpec, showTrace, showSkin,
527 			modulation_wheel, portamento, nrpn_vibrato, reverb_control,
528 			chorus_control, surround_chorus, channel_pressure,
529 			xg_bank_select_lsb, trace_text_meta_event, overlap_voice_allow,
530 			do_reverb_flag;
531 	int		evil_level,do_initial_filling;
532 	int		gShuffle;
533 	char	skin_mainfile[256];
534 	char	wrdfontname[256];
535 	char	rsv[256];
536 }Preference;
537 
538 
539 #define	PREF_VER	14
540 						/* ++ 2.6.1        ->prefver=14 */
541 						/* ++ 2.1.0        ->prefver=13 */
542 #define	PREF_NUM	(sizeof(Preference))	/*pref data bytes*/
543 
mac_GetPreference()544 OSErr mac_GetPreference()
545 {
546 	OSErr	err;
547 	short	vRefNum, refNum=0;
548 	long	count, dirID;
549 	FSSpec	spec;
550 
551 	memset(&Preference, 0, sizeof(Preference) );
552 
553 	err=FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder,
554 						&vRefNum, &dirID);
555 	if( err ) return err;
556 
557 	err=FSMakeFSSpec(vRefNum, dirID, PREF_FILENAME, &spec);
558 	if( err )	return err;	//pref file not found
559 
560 	err=FSpOpenDF(&spec, fsRdPerm, &refNum);
561 	if( err )	return err;
562 
563 	count=PREF_NUM;
564 	err=FSRead(refNum, &count, (char*)&Preference);
565 	FSClose(refNum);
566 	if( Preference.version!=PREF_VER || count<PREF_NUM )
567 	{
568 		StopAlertMessage("\pPreference file is invalid! Default Setting is applyed.");
569 		return 1;
570 	}
571 
572 
573 	mac_PlayerWindow.X=	Preference.playerX;
574 	mac_PlayerWindow.Y=	Preference.playerY;
575 	mac_LogWindow.X=	Preference.logX;
576 	mac_LogWindow.Y=	Preference.logY;
577 	mac_LogWindow.width=Preference.logW;
578 	mac_LogWindow.hight=Preference.logH;
579 	mac_ListWindow.X=		Preference.listX;
580 	mac_ListWindow.Y=		Preference.listY;
581 	mac_ListWindow.width=	Preference.listW;
582 	mac_ListWindow.hight=	Preference.listH;
583 
584 	mac_DocWindow.X=		Preference.docX;
585 	mac_DocWindow.Y=		Preference.docY;
586 	mac_DocWindow.width=	Preference.docW;
587 	mac_DocWindow.hight=	Preference.docH;
588 
589 	mac_SpecWindow.X=	Preference.specX;
590 	mac_SpecWindow.Y=	Preference.specY;
591 	mac_TraceWindow.X=	Preference.traceX;
592 	mac_TraceWindow.Y=	Preference.traceY;
593 	mac_WrdWindow.X=	Preference.wrdX;
594 	mac_WrdWindow.Y=	Preference.wrdY;
595 	mac_WrdWindow.X=	Preference.wrdX;
596 	mac_WrdWindow.Y=	Preference.wrdY;
597 	mac_SkinWindow.X=	Preference.skinX;
598 	mac_SkinWindow.Y=	Preference.skinY;
599 
600 	play_mode->rate=Preference.rate;
601 	if( Preference.mono ){
602 		play_mode->encoding |= PE_MONO;		/*mono*/
603 	}else{
604 		play_mode->encoding &= ~PE_MONO;	/*stereo*/
605 	}
606 	free_instruments_afterwards=	Preference.freeinstrument;
607 	antialiasing_allowed=			Preference.antialias;
608 	fast_decay=						Preference.fastdecay;
609 	adjust_panning_immediately=		Preference.adjustpanning;
610 	voices=							Preference.voice;
611 	mac_amplitude=					Preference.amplitude;
612 	control_ratio=					Preference.controlratio;
613 	gSilentSec=						Preference.silentsec;
614 	modify_release=					Preference.modify_release;
615 	effect_lr_mode=					Preference.effect_lr_mode;
616 	opt_default_mid=				Preference.opt_default_mid;
617 
618 	mac_LogWindow.show=				Preference.showMsg;
619 	mac_ListWindow.show=			Preference.showList;
620 	mac_DocWindow.show=				Preference.showDoc;
621 	mac_WrdWindow.show=				Preference.showWrd;
622 	mac_DocWindow.show=				Preference.showDoc;
623 	mac_SpecWindow.show=			Preference.showSpec;
624 	mac_TraceWindow.show=			Preference.showTrace;
625 
626 	opt_modulation_wheel =		Preference.modulation_wheel;
627 	opt_portamento =			Preference.portamento;
628 	opt_nrpn_vibrato =			Preference.nrpn_vibrato;
629 	opt_reverb_control =		Preference.reverb_control;
630 	opt_chorus_control =		Preference.chorus_control;
631 	opt_surround_chorus = 		Preference.surround_chorus;
632 	opt_channel_pressure =		Preference.channel_pressure;
633 	opt_trace_text_meta_event =	Preference.trace_text_meta_event;
634 	opt_overlap_voice_allow =	Preference.overlap_voice_allow;
635 	evil_level=					Preference.evil_level;
636 	do_initial_filling=			Preference.do_initial_filling;
637 	gShuffle=					Preference.gShuffle;
638 
639 	return noErr;
640 }
641 
mac_SetPreference()642 OSErr mac_SetPreference()
643 {
644 	OSErr	err;
645 	short	vRefNum,refNum=0;
646 	long	count;
647 	long	dirID;
648 	Point p={0,0};
649 	FSSpec	spec;
650 
651 	err=FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder,
652 						&vRefNum, &dirID);
653 	if( err ) return err;
654 
655 	err=FSMakeFSSpec(vRefNum, dirID, PREF_FILENAME, &spec);
656 	if( err==fnfErr )
657 	{
658 		err=FSpCreate(&spec, 'TIMI', 'pref', smSystemScript);
659 		if(err) return err;
660 	}
661 	else if( err!=noErr ) return err;
662 
663 	err=FSpOpenDF(&spec, fsWrPerm, &refNum);
664 	if( err )	return err;
665 
666 	Preference.version=	PREF_VER;
667 	Preference.playerX=	mac_PlayerWindow.X;
668 	Preference.playerY=	mac_PlayerWindow.Y;
669 	Preference.logX=	mac_LogWindow.X;
670 	Preference.logY=	mac_LogWindow.Y;
671 	Preference.logW=	mac_LogWindow.width;
672 	Preference.logH=	mac_LogWindow.hight;
673 	Preference.listX=	mac_ListWindow.X;
674 	Preference.listY=	mac_ListWindow.Y;
675 	Preference.listW=	mac_ListWindow.width;
676 	Preference.listH=	mac_ListWindow.hight;
677 	Preference.docX=	mac_DocWindow.X;
678 	Preference.docY=	mac_DocWindow.Y;
679 	Preference.docW=	mac_DocWindow.width;
680 	Preference.docH=	mac_DocWindow.hight;
681 	Preference.specX=	mac_SpecWindow.X;
682 	Preference.specY=	mac_SpecWindow.Y;
683 	Preference.traceX=	mac_TraceWindow.X;
684 	Preference.traceY=	mac_TraceWindow.Y;
685 	Preference.wrdX=	mac_WrdWindow.X;
686 	Preference.wrdY=	mac_WrdWindow.Y;
687 	Preference.skinX=	mac_SkinWindow.X;
688 	Preference.skinY=	mac_SkinWindow.Y;
689 
690 	Preference.rate=	play_mode->rate;
691 	Preference.mono=	(play_mode->encoding & PE_MONO);
692 	Preference.freeinstrument=	free_instruments_afterwards;
693 	Preference.antialias=		antialiasing_allowed;
694 	Preference.fastdecay=		fast_decay;
695 	Preference.adjustpanning=	adjust_panning_immediately;
696 	Preference.voice=			voices;
697 	Preference.amplitude=		mac_amplitude;
698 	Preference.controlratio=	control_ratio;
699 	Preference.silentsec=		gSilentSec;
700 	Preference.modify_release=	modify_release;
701 	Preference.effect_lr_mode=	effect_lr_mode;
702 	Preference.opt_default_mid=	opt_default_mid;
703 
704 	Preference.showMsg=			mac_LogWindow.show;
705 	Preference.showList=		mac_ListWindow.show;
706 	Preference.showWrd=			mac_WrdWindow.show;
707 	Preference.showDoc=			mac_DocWindow.show;
708 	Preference.showSpec=		mac_SpecWindow.show;
709 	Preference.showTrace=		mac_TraceWindow.show;
710 
711 	Preference.modulation_wheel=	opt_modulation_wheel;
712 	Preference.portamento=			opt_portamento;
713 	Preference.nrpn_vibrato=		opt_nrpn_vibrato;
714 	Preference.reverb_control=		opt_reverb_control;
715 	Preference.chorus_control=		opt_chorus_control;
716 	Preference.channel_pressure=	opt_channel_pressure;
717 	Preference.trace_text_meta_event=opt_trace_text_meta_event;
718 	Preference.overlap_voice_allow=	opt_overlap_voice_allow;
719 	Preference.evil_level=			evil_level;
720 	Preference.do_initial_filling=	do_initial_filling;
721 	Preference.gShuffle=			gShuffle;
722 
723 	count=PREF_NUM;
724 	err=FSWrite(refNum, &count, &Preference);
725 	FSClose(refNum);
726 
727 	return noErr;
728 }
729 
730