How to resolve the algorithm Metronome step by step in the REXX programming language
How to resolve the algorithm Metronome step by step in the REXX programming language
Table of Contents
Problem Statement
The task is to implement a metronome. The metronome should be capable of producing high and low audio beats, accompanied by a visual beat indicator, and the beat pattern and tempo should be configurable. For the purpose of this task, it is acceptable to play sound files for production of the beat notes, and an external player may be used. However, the playing of the sounds should not interfere with the timing of the metronome. The visual indicator can simply be a blinking red or green area of the screen (depending on whether a high or low beat is being produced), and the metronome can be implemented using a terminal display, or optionally, a graphical display, depending on the language capabilities. If the language has no facility to output sound, then it is permissible for this to implemented using just the visual indicator.
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Metronome step by step in the REXX programming language
Source code in the rexx programming language
/*REXX program simulates a visual (textual) metronome (with no sound). */
parse arg bpm bpb dur . /*obtain optional arguments from the CL*/
if bpm=='' | bpm=="," then bpm=72 /*the number of beats per minute. */
if bpb=='' | bpb=="," then bpb= 4 /* " " " " " bar. */
if dur=='' | dur=="," then dur= 5 /*duration of the run in seconds. */
call time 'Reset' /*reset the REXX elapsed timer. */
bt=1/bpb /*calculate a tock-time interval. */
do until et>=dur; et=time('Elasped') /*process tick-tocks for the duration*/
say; call charout ,'TICK' /*show the first tick for the period. */
es=et+1 /*bump the elapsed time "limiter". */
$t=et+bt
do until e>=es; e=time('Elapsed')
if e<$t then iterate /*time for tock? */
call charout , ' tock' /*show a "tock". */
$t=$t+bt /*bump the TOCK time.*/
end /*until e≥es*/
end /*until et≥dur*/
/*stick a fork in it, we're all done. */
/*REXX program simulates a metronome (with sound). Regina REXX only. */
parse arg bpm bpb dur tockf tockd tickf tickd . /*obtain optional arguments from the CL*/
if bpm=='' | bpm=="," then bpm= 72 /*the number of beats per minute. */
if bpb=='' | bpb=="," then bpb= 4 /* " " " " " bar. */
if dur=='' | dur=="," then dur= 5 /*duration of the run in secs*/
if tockf=='' | tockf=="," then tockf=400 /*frequency " " tock sound " HZ. */
if tockd=='' | tockd=="," then tockd= 20 /*duration " " " " " msec*/
if tickf=='' | tickf=="," then tickf=600 /*frequency " " tick " " HZ. */
if tickd=='' | tickd=="," then tickd= 10 /*duration " " " " " msec*/
call time 'Reset' /*reset the REXX elapsed timer. */
bt=1/bpb /*calculate a tock─time interval. */
do until et>=dur; et=time('Elasped') /*process tick-tocks for the duration*/
call beep tockf, tockd /*sound a beep for the "TOCK". */
es=et+1 /*bump the elapsed time "limiter". */
$t=et+bt
do until e>=es; e=time('Elapsed')
if e<$t then iterate /*time for tock? */
call beep tickf, tickd /*sound a "tick". */
$t=$t+bt /*bump the TOCK time.*/
end /*until e≥es*/
end /*until et≥dur*/
/*stick a fork in it, we're all done. */
/*REXX program simulates a metronome (with sound). PC/REXX or Personal REXX only.*/
parse arg bpm bpb dur tockf tockd tickf tickd . /*obtain optional arguments from the CL*/
if bpm=='' | bpm=="," then bpm= 72 /*the number of beats per minute. */
if bpb=='' | bpb=="," then bpb= 4 /* " " " " " bar. */
if dur=='' | dur=="," then dur= 5 /*duration of the run in secs*/
if tockf=='' | tockf=="," then tockf=400 /*frequency " " tock sound " HZ. */
if tockd=='' | tockd=="," then tockd= .02 /*duration " " " " " sec.*/
if tickf=='' | tickf=="," then tickf=600 /*frequency " " tick " " HZ. */
if tickd=='' | tickd=="," then tickd= .01 /*duration " " " " " sec.*/
call time 'Reset' /*reset the REXX elapsed timer. */
bt=1/bpb /*calculate a tock─time interval. */
do until et>=dur; et=time('Elasped') /*process tick-tocks for the duration*/
call sound tockf, tockd /*sound a beep for the "TOCK". */
es=et+1 /*bump the elapsed time "limiter". */
$t=et+bt
do until e>=es; e=time('Elapsed')
if e<$t then iterate /*time for tock? */
call sound tickf, tickd /*sound a tick. */
$t=$t+bt /*bump the TOCK time.*/
end /*until e≥es*/
end /*until et≥dur*/
/*stick a fork in it, we're all done. */
You may also check:How to resolve the algorithm Spiral matrix step by step in the XPL0 programming language
You may also check:How to resolve the algorithm Amb step by step in the V (Vlang) programming language
You may also check:How to resolve the algorithm Exceptions step by step in the Applesoft BASIC programming language
You may also check:How to resolve the algorithm Circular primes step by step in the Raku programming language
You may also check:How to resolve the algorithm Strip control codes and extended characters from a string step by step in the BQN programming language