180 lines
4.3 KiB
Plaintext
180 lines
4.3 KiB
Plaintext
/*
|
||
Basic Tempo Markings from slowest to fastest:
|
||
|
||
• Larghissimo – very, very slow (24 bpm and under)
|
||
• Grave – very slow (25–45 bpm)
|
||
• Largo – broadly (40–60 bpm)
|
||
• Lento – slowly (45–60 bpm)
|
||
• Larghetto – rather broadly (60–66 bpm)
|
||
• Adagio – slow & (literally (66–76 bpm)
|
||
• Adagietto – slower than andante (72–76 bpm)
|
||
• Andante – walking pace (76–108 bpm)
|
||
• Andantino – slightly faster (80–108 bpm)
|
||
• Marcia moderato – moderately, a march (83–85 bpm)
|
||
• Andante moderato – between andante and moderato (92–112 bpm)
|
||
• Moderato – moderately (108–120 bpm)
|
||
• Allegretto – moderately fast (112–120 bpm)
|
||
• Allegro moderato – not quite allegro (116–120 bpm)
|
||
• Allegro – fast, quick, bright (120–168 bpm)
|
||
• Vivace – lively and fast (168–176 bpm)
|
||
• Vivacissimo – very fast and lively (172–176 bpm)
|
||
• Allegrissimo – very fast (172–176 bpm)
|
||
• Presto – very, very fast (168–200 bpm)
|
||
• Prestissimo – even faster (200 bpm and over)
|
||
*/
|
||
|
||
output file "Metronome"
|
||
|
||
include "Tlbx AVFoundation.incl"
|
||
|
||
// Uncomment next line to use external sound file, and make necessary adjustments in fn RunMetronome
|
||
// include resources "toc.wav"
|
||
|
||
begin enum
|
||
_mApplication
|
||
_mFile
|
||
_mEdit
|
||
_mColor
|
||
end enum
|
||
|
||
begin enum 1
|
||
_iSeparator
|
||
_iPreferences
|
||
end enum
|
||
|
||
begin enum
|
||
_iClose
|
||
end enum
|
||
|
||
_window = 1
|
||
begin enum 1
|
||
_slider = 30
|
||
_bpmIndicator
|
||
end enum
|
||
|
||
_initialBPM = 100
|
||
|
||
void local fn BuildMenus
|
||
'~'1
|
||
// application
|
||
menu _mApplication, _iSeparator
|
||
menu _mApplication, _iPreferences,, @"Preferences…", @","
|
||
|
||
// file
|
||
menu _mFile, -1,, @"File"
|
||
menu _mFile, _iClose,, @"Close", @"w"
|
||
MenuItemSetAction( _mFile, _iClose, @"performClose:" )
|
||
|
||
editmenu _mEdit
|
||
end fn
|
||
|
||
|
||
void local fn BuildWindow
|
||
'~'1
|
||
NSUInteger i
|
||
|
||
CGRect r = fn CGRectMake( 0, 0, 200, 500 )
|
||
window _window, @"Metronome", r, NSWindowStyleMaskTitled + NSWindowStyleMaskClosable + NSWindowStyleMaskMiniaturizable
|
||
|
||
r = fn CGRectMake( 160, 20, 32, 465 )
|
||
slider _slider, YES, _initialBPM, r, 20, 190, _window
|
||
|
||
r = fn CGRectMake( 25, 458, 24, 24 )
|
||
colorwell _bpmIndicator, YES, fn ColorGreen, r, NO, _window
|
||
ColorWellSetBordered( _bpmIndicator, NO )
|
||
|
||
CFArrayRef tempo = @[¬
|
||
@"Prestissimo", @"Presto", @"Allegrissimo", @"Vivacissimo", @"Vivace",¬
|
||
@"Allegro", @"Allegro moderato", @"Allegretto", @"Moderato", @"Andante moderato",¬
|
||
@"Marcia moderato", @"Andantino", @"Andante", @"Adagietto", @"Adagio", @"Larghetto",¬
|
||
@"Lento", @"Largo", @"Grave", @"Larghissimo"]
|
||
|
||
r = fn CGRectMake( 10, 460, 140, 22 )
|
||
for i = 1 to 20
|
||
textlabel i, tempo[i-1], r, _window
|
||
ControlSetAlignment( i, NSTextAlignmentRight )
|
||
ControlSetFontWithName( i, @"Menlo", 11.5 )
|
||
r = fn CGRectOffset( r, 0, -23.2 )
|
||
next
|
||
end fn
|
||
|
||
|
||
local fn StopTimer
|
||
'~'1
|
||
CFRunLoopTimerRef t = (CFRunLoopTimerRef)fn AppProperty( @"timer" )
|
||
if ( fn TimerIsValid( t ) )
|
||
TimerInvalidate( t )
|
||
ColorWellSetColor( _bpmIndicator, fn ColorGreen )
|
||
end if
|
||
end fn
|
||
|
||
|
||
local fn RunMetronome( bpm as CFTimeInterval )
|
||
'~'1
|
||
|
||
// Uncomment these lines to use an external sound file name toc.wave
|
||
// CFURLRef soundURL = fn BundleURLForSoundResource( fn BundleMain, @"toc.wav" )
|
||
// SoundRef tocSound = fn SoundWithContentsOfURL( soundURL, NO )
|
||
|
||
// Comment this line out to use external sound file for tock sound
|
||
SoundRef tocSound = fn SoundNamed( @"Pop" )
|
||
|
||
CFTimeInterval interval = 60.0 / bpm
|
||
CFRunLoopTimerRef tocTimer = timerbegin 0.0, interval, YES
|
||
ColorRef color
|
||
if ( fn ObjectIsEqual( fn ColorWellColor( _bpmIndicator ), fn ColorGreen ) )
|
||
color = fn ColorGray
|
||
ColorWellSetColor( _bpmIndicator, color )
|
||
else
|
||
color = fn ColorGreen
|
||
ColorWellSetColor( _bpmIndicator, color )
|
||
end if
|
||
|
||
fn SoundStop( tocSound )
|
||
fn SoundPlay( tocSound )
|
||
timerend
|
||
AppSetProperty( @"timer", tocTimer )
|
||
end fn
|
||
|
||
|
||
void local fn DoAppEvent( ev as long )
|
||
'~'1
|
||
select (ev)
|
||
case _appDidFinishLaunching
|
||
fn BuildMenus
|
||
fn BuildWindow
|
||
fn RunMetronome( _initialBPM )
|
||
|
||
case _appShouldTerminateAfterLastWindowClosed
|
||
AppEventSetBool(YES)
|
||
end select
|
||
end fn
|
||
|
||
|
||
void local fn DoMenu( menuID as long, itemID as long )
|
||
'~'1
|
||
select (menuID)
|
||
case _mApplication
|
||
select (itemID)
|
||
case _iPreferences
|
||
end select
|
||
end select
|
||
end fn
|
||
|
||
|
||
void local fn DoDialog( ev as long, tag as long, wnd as long )
|
||
'~'1
|
||
select ( ev )
|
||
case _btnClick
|
||
select ( tag )
|
||
case _slider : fn StopTimer : fn RunMetronome( fn ControlIntegerValue( tag ) )
|
||
end select
|
||
end select
|
||
end fn
|
||
|
||
on AppEvent fn DoAppEvent
|
||
on menu fn DoMenu
|
||
on dialog fn DoDialog
|
||
|
||
HandleEvents
|