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