Musical scale: Difference between revisions
No edit summary |
→{{header|REXX}}: added the REXX language. -- ~~~~ |
||
Line 20: | Line 20: | ||
shell "play -n -c1 synth 0.2 sin %{$_ - 9}" |
shell "play -n -c1 synth 0.2 sin %{$_ - 9}" |
||
}</lang> |
}</lang> |
||
=={{header|REXX}}== |
|||
{{works with|PC/REXX}} |
|||
{{works with|Personal REXX}} |
|||
<lang rexx>/*REXX pgm sounds 8 notes of the C major natural diatonic muscic scale. */ |
|||
$ = 'do ra me fa so la te do' |
|||
dur=1/4 |
|||
do j=1 for words($) /*sound each "note" in the string*/ |
|||
call notes word($,j),dur /*invoke a subroutine for sounds.*/ |
|||
end /*j*/ |
|||
exit /*stick a fork in it, we're done.*/ |
|||
/*─────────────────────────────────NOTES subroutine─────────────────────*/ |
|||
notes: procedure; arg note,dur; @.=0 /*define common names for sounds.*/ |
|||
@.la=220;@.si=246.94;@.te=@.si;@.ta=@.te;@.ti=@.te;@.do=261.6256;@.ut=@.do |
|||
@.re=293.66;@.mi=329.63;@.ma=@.mi;@.fa=349.23;@.so=392;@.sol=@.so |
|||
if @.note\==0 then call sound @.note,dur /*sound the "note".*/ |
|||
return</lang> |
|||
=={{header|Tcl}}== |
=={{header|Tcl}}== |
Revision as of 21:44, 25 May 2013
Output 8 notes of the C major natural diatonic music scale (These are the notes C,D,E,F,G,A,B,c or Do, Ra, Me, Fa, So, La, Te, do on the solfa) to the default musical sound device on the system. For the purpose of this task, middle C should be used as the starting note, and crotchet notes should be used.
For languages that cannot utilize a sound device, it is permissible to output to a musical score sheet or midi file or the task can be omitted.
Lilypond
The lilypond tool produces musical score sheets and does not output notes to the sound device. <lang lilypond>% Start at middle C \relative c' {
c d e f g a b c
}</lang>
Mathematica
<lang mathematica>EmitSound@Sound[SoundNote /@ {0, 2, 4, 5, 7, 9, 11, 12}]</lang>
Perl 6
<lang perl6>for 0,2,4,5,7,9,11,12 {
shell "play -n -c1 synth 0.2 sin %{$_ - 9}"
}</lang>
REXX
<lang rexx>/*REXX pgm sounds 8 notes of the C major natural diatonic muscic scale. */ $ = 'do ra me fa so la te do' dur=1/4
do j=1 for words($) /*sound each "note" in the string*/ call notes word($,j),dur /*invoke a subroutine for sounds.*/ end /*j*/
exit /*stick a fork in it, we're done.*/ /*─────────────────────────────────NOTES subroutine─────────────────────*/ notes: procedure; arg note,dur; @.=0 /*define common names for sounds.*/ @.la=220;@.si=246.94;@.te=@.si;@.ta=@.te;@.ti=@.te;@.do=261.6256;@.ut=@.do @.re=293.66;@.mi=329.63;@.ma=@.mi;@.fa=349.23;@.so=392;@.sol=@.so if @.note\==0 then call sound @.note,dur /*sound the "note".*/ return</lang>
Tcl
<lang tcl>package require sound
- Encapsulate the tone generation
set filter [snack::filter generator 1 20000 0.5 sine -1] set sound [snack::sound -rate 22050] proc play {frequency length} {
global filter sound
$filter configure $frequency $sound play -filter $filter
# Need to run event loop; Snack uses it internally after $length {set donePlay 1} vwait donePlay
$sound stop
}
- Major scale up, then down; extra delay at ends of scale
set tonicFrequency 261.63; # C4 foreach i {0 2 4 5 7 9 11 12 11 9 7 5 4 2 0} {
play [expr {$tonicFrequency*2**($i/12.0)}] [expr {$i%12?250:500}]
}</lang>
ZX Spectrum Basic
<lang zxbasic>10 REM Musical scale 20 LET n=0: REM Start at middle C 30 LET d=0.2: REM Make each note 0.2 seconds in duration 40 FOR l=1 TO 8 50 BEEP d,n 60 READ i: REM Number of semitones to increment 70 LET n=n+i 80 NEXT l 90 STOP 9000 DATA 2,2,1,2,2,2,1,2:REM WWHWWWH</lang>