Data commit

This commit is contained in:
Ingy döt Net 2023-07-01 11:58:00 -04:00
parent 7387c8f97b
commit cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions

View file

@ -0,0 +1,4 @@
---
category:
- Temporal media
from: http://rosettacode.org/wiki/Musical_scale

View file

@ -0,0 +1,9 @@
;Task:
Output the 8 notes of the <b>C major</b> diatonic scale to the default musical sound device on the system. Specifically, pitch must be tuned to 12-tone equal temperament (12TET) with the modern standard A=440Hz.
These are the notes "C, D, E, F, G, A, B, C(1 octave higher)", or "Do, Re, Mi, Fa, Sol, La, Si/Ti, Do(1 octave higher)" on <i>Fixed do Solfège</i>.
For the purpose of this task, <b>Middle C</b> (in the case of the above tuning, around 261.63 Hz) should be used as the starting note, and any note duration is allowed.
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.

View file

@ -0,0 +1,46 @@
DEFINE PTR="CARD"
PROC Wait(BYTE frames)
BYTE RTCLOK=$14
frames==+RTCLOK
WHILE frames#RTCLOK DO OD
RETURN
PROC Main()
BYTE AUDCTL=$D208,AUDF1=$D200,AUDC1=$D201,AUDF2=$D202,AUDC2=$D203
PTR ARRAY notes(8)
BYTE ARRAY pitch8=[60 53 47 45 40 35 31 30]
CARD ARRAY pitch16=[1703 1517 1350 1274 1134 1010 899 848]
BYTE i
CARD p
notes(0)="Do" notes(1)="Re" notes(2)="Mi" notes(3)="Fa"
notes(4)="Sol" notes(5)="La" notes(6)="Si" notes(7)="Do"
PrintE("8-bit precision pitch values:")
FOR i=0 TO 7
DO
PrintF("%S-%B ",notes(i),pitch8(i))
Sound(0,pitch8(i),10,10)
Wait(20)
OD
SndRst()
Wait(20)
PutE() PutE()
AUDCTL=$50 ;join channel 1 and 2 to get 16-bit
AUDC1=$A0 ;turn off channel 1
AUDC2=$AA ;turn on channel 2
PrintE("16-bit precision pitch values:")
FOR i=0 TO 7
DO
PrintF("%S-%U ",notes(i),pitch16(i))
p=pitch16(i)
AUDF2=p RSH 8
AUDF1=p&$FF
Wait(20)
OD
SndRst()
AUDCTL=$00 ;restore default configuration
Wait(20)
RETURN

View file

@ -0,0 +1,6 @@
FOR i=1 to 8
READ f
SOUND f,10
NEXT
DATA 261.63, 293.66, 329.63, 349.23, 392.00, 440.00, 493.88, 523.25

View file

@ -0,0 +1,2 @@
for key, val in [261.63, 293.66, 329.63, 349.23, 392.00, 440.00, 493.88, 523.25]
SoundBeep, % val, 500

View file

@ -0,0 +1 @@
sound {261.63, 500, 293.66, 500, 329.63, 500, 349.23, 500, 392, 500, 440, 500, 493.88, 500, 523.25, 500}

View file

@ -0,0 +1,5 @@
> "HGECA@><"8: v
v0*73"MThd"0006010101"MTrk"000<
>>#1-#,:#\_$8*74++,0,28*"'"039v
v,:,\,*2,1"Hd":\<,,,,,,*3"U"*9<
>"@1",2*,\,,1-:#^_"/3d",5*,,, @

View file

@ -0,0 +1,73 @@
#include <iostream>
#include <windows.h>
#include <mmsystem.h>
#pragma comment ( lib, "winmm.lib" )
typedef unsigned char byte;
typedef union
{
unsigned long word;
unsigned char data[4];
}
midi_msg;
class midi
{
public:
midi()
{
if( midiOutOpen( &device, 0, 0, 0, CALLBACK_NULL) != MMSYSERR_NOERROR )
{
std::cout << "Error opening MIDI Output..." << std::endl;
device = 0;
}
}
~midi()
{
midiOutReset( device );
midiOutClose( device );
}
bool isOpen() { return device != 0; }
void setInstrument( byte i )
{
message.data[0] = 0xc0; message.data[1] = i;
message.data[2] = 0; message.data[3] = 0;
midiOutShortMsg( device, message.word );
}
void playNote( byte n, unsigned i )
{
playNote( n ); Sleep( i ); stopNote( n );
}
private:
void playNote( byte n )
{
message.data[0] = 0x90; message.data[1] = n;
message.data[2] = 127; message.data[3] = 0;
midiOutShortMsg( device, message.word );
}
void stopNote( byte n )
{
message.data[0] = 0x90; message.data[1] = n;
message.data[2] = 0; message.data[3] = 0;
midiOutShortMsg( device, message.word );
}
HMIDIOUT device;
midi_msg message;
};
int main( int argc, char* argv[] )
{
midi m;
if( m.isOpen() )
{
byte notes[] = { 60, 62, 64, 65, 67, 69, 71, 72 };
m.setInstrument( 42 );
for( int x = 0; x < 8; x++ )
m.playNote( notes[x], rand() % 100 + 158 );
Sleep( 1000 );
}
return 0;
}

View file

@ -0,0 +1,27 @@
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<dos.h>
typedef struct{
char str[3];
int key;
}note;
note sequence[] = {{"Do",0},{"Re",2},{"Mi",4},{"Fa",5},{"So",7},{"La",9},{"Ti",11},{"Do",12}};
int main(void)
{
int i=0;
while(!kbhit())
{
printf("\t%s",sequence[i].str);
sound(261.63*pow(2,sequence[i].key/12.0));
delay(sequence[i].key%12==0?500:1000);
i = (i+1)%8;
i==0?printf("\n"):printf("");
}
nosound();
return 0;
}

View file

@ -0,0 +1,24 @@
#include<windows.h>
#include<stdio.h>
#include<math.h>
typedef struct{
char str[3];
int key;
}note;
note sequence[] = {{"Do",0},{"Re",2},{"Mi",4},{"Fa",5},{"So",7},{"La",9},{"Ti",11},{"Do",12}};
int main(void)
{
int i=0;
while(1)
{
printf("\t%s",sequence[i].str);
Beep(261.63*pow(2,sequence[i].key/12.0),sequence[i].key%12==0?500:1000);
i = (i+1)%8;
i==0?printf("\n"):printf("");
}
return 0;
}

View file

@ -0,0 +1,14 @@
(use 'overtone.live)
; Define your desired instrument
; Using saw-wave from: https://github.com/overtone/overtone/wiki/Chords-and-scales
(definst saw-wave [freq 440 attack 0.01 sustain 0.4 release 0.1 vol 0.4]
(* (env-gen (env-lin attack sustain release) 1 1 0 1 FREE)
(saw freq)
vol))
(defn play [note ms]
(saw-wave (midi->hz note))
(Thread/sleep ms))
(doseq [note (scale :c4 :major)] (play note 500))

View file

@ -0,0 +1,18 @@
10 rem musical scale
15 rem rosetta code
20 print chr$(147)
25 s=54272
30 for l=s to s+23:poke l,0:next
35 poke s+5,9:poke s+6,0
40 poke s+24,15
45 for i=1 to 8
50 read fq
60 ff=int(fq/.06097)
65 fh=int(ff/256):fl=ff-(256*fh)
70 poke s+1,fh:poke s,fl
75 poke s+4,17
80 for d=1 to 350:next
85 poke s+4,16
90 for d=1 to 25:next
95 next i
500 data 261.63,293.66,329.63,349.23,392,440,493.88,523.25

View file

@ -0,0 +1,2 @@
10 print chr$(147)
20 play "o4 cdefgab o5 c"

View file

@ -0,0 +1,16 @@
program Musical_scale;
{$APPTYPE CONSOLE}
uses
Winapi.Windows;
var
notes: TArray<Double> = [261.63, 293.66, 329.63, 349.23, 392.00, 440.00,
493.88, 523.25];
begin
for var note in notes do
Beep(Round(note), 500);
readln;
end.

View file

@ -0,0 +1,5 @@
n[] = [ 262 294 330 349 392 440 494 523 ]
for t in n[]
sound [ t 0.5 ]
sleep 0.6
.

View file

@ -0,0 +1,22 @@
(defun play-scale (freq-list dur)
"Play a list of frequencies."
(setq header (unibyte-string ; AU header:
46 115 110 100 ; ".snd" magic number
0 0 0 24 ; start of data bytes
255 255 255 255 ; file size is unknown
0 0 0 3 ; 16 bit PCM samples
0 0 172 68 ; 44,100 samples/s
0 0 0 1)) ; mono
(setq s nil)
(dolist (freq freq-list)
(setq v (mapcar (lambda (x)
(mod (round (* 32000 (sin (* 2 pi freq x (/ 44100.0))))) 65536))
(number-sequence 0 (* dur 44100))))
(setq s (apply #'concat s (flatten-list (mapcar (lambda (x)
(list (unibyte-string (ash x -8))
(unibyte-string (mod x 256))))
v)))))
(setq s (concat header s))
(play-sound `(sound :data ,s)))
(play-scale '(261.63 293.66 329.63 349.23 392.00 440.00 493.88 523.25) .5)

View file

@ -0,0 +1,89 @@
HEX
\ PC speaker hardware control (requires giveio or DOSBOX for windows operation)
042 constant fctrl 061 constant sctrl
0FC constant smask 043 constant tctrl
0B6 constant spkr
: sing ( -- ) sctrl pc@ 03 or sctrl pc! ;
: silence ( -- ) sctrl pc@ smask and 01 or sctrl pc! ;
: tone ( divisor -- )
?dup \ check for non-zero input
if spkr tctrl pc! \ enable PC speaker
dup fctrl pc! \ load low byte
8 rshift fctrl pc! \ load high byte
sing
else silence
then ;
DECIMAL
1193181. 2constant clock \ internal oscillator freq. MHz x 10
: Hz ( freq -- divisor) clock rot um/mod nip ; \ convert Freq to osc. divisor
\ duration control variables and values
variable on_time
variable off_time
variable feel \ controls the on/off time ratio
60 value tempo
4000 tempo um* 2constant timebase \ 1 whole note=4000 ms @ 60 Beats/min
: bpm>ms ( bpm -- ms) timebase rot um/mod nip ; \ convert beats per minute to milliseconds
: wholenote ( -- ms ) tempo bpm>ms ; \ using tempo set the BPM
: play ( divisor -- )
tone on_time @ ms silence off_time @ ms ;
: expression ( ms n --) \ adjust the on:off ratio using n
over swap - tuck - ( -- on-mS off-mS )
off_time ! on_time ! ; \ store times in variables
: note ( -- ms ) on_time @ off_time @ + ; \ returns duration of current note
: duration! ( ms -- ) feel @ expression ;
: 50% ( n -- n/2) 2/ ;
: % ( n n2 -- n%) 100 */ ; \ calculate n2% of n
: 50%+ ( n -- n+50%) dup 50% + ; \ dotted notes have 50% more time
VOCABULARY MUSIC
MUSIC DEFINITIONS
: BPM ( bpm -- ) \ set tempo in beats per minute
to tempo
wholenote duration! ;
: legato 0 feel ! ;
: staccatto note 8 % feel ! ;
: Marcato note 3 % feel ! ;
: 1/1 wholenote duration! ;
: 1/2 wholenote 50% duration! ;
: 1/2. 1/2 note 50%+ duration! ;
: 1/4 1/2 note 50% duration! ;
: 1/4. 1/4 note 50%+ duration! ;
: 1/8 1/4 note 50% duration! ;
: 1/8. 1/8 note 50%+ duration! ;
: 1/16 1/8 note 50% duration! ;
: 1/32 1/16 note 50% duration! ;
: rest note ms ;
\ note object creator
: note: create hz , \ compile time: compile divisor into the note
does> @ play ; \ run time: fetch the value and play the tone
\ freq Natural Freq Accidental En-harmonic
\ ------------- ---------------- ----------------
131 note: C3 139 note: C#3 synonym Db3 C#3
147 note: D3 156 note: D#3 synonym Eb3 D#3
165 note: E3
175 note: F3 185 note: F#3 synonym Gb3 F#3
196 note: G3 208 note: G#3 synonym Ab3 G#3
220 note: A3 233 note: A#3 synonym Bb3 A#3
247 note: B3
262 note: C4 277 note: C#4 synonym Db4 C#4
: Cmajor 1/8 C3 D3 E3 F3 G3 A3 B3 C4 ;
: Chromatic 1/8 C3 C#3 D3 D#3 E3 F3 F#3 G3 G#3 A3 A#3 B3 C4 ;

View file

@ -0,0 +1,73 @@
REM FreeBASIC no tiene la capacidad de emitir sonido de forma nativa.
REM La función Sound no es mía, incluyo los créditos correspondientes.
' Sound Function v0.3 For DOS/Linux/Win by yetifoot
' Credits:
' http://www.frontiernet.net/~fys/snd.htm
' http://delphi.about.com/cs/adptips2003/a/bltip0303_3.htm
#ifdef __FB_WIN32__
#include Once "windows.bi"
#endif
Sub Sound_DOS_LIN(Byval freq As Uinteger, dur As Uinteger)
Dim t As Double
Dim As Ushort fixed_freq = 1193181 \ freq
Asm
mov dx, &H61 ' turn speaker on
in al, dx
or al, &H03
out dx, al
mov dx, &H43 ' get the timer ready
mov al, &HB6
out dx, al
mov ax, word Ptr [fixed_freq] ' move freq to ax
mov dx, &H42 ' port to out
out dx, al ' out low order
xchg ah, al
out dx, al ' out high order
End Asm
t = Timer
While ((Timer - t) * 1000) < dur ' wait for out specified duration
Sleep(1)
Wend
Asm
mov dx, &H61 ' turn speaker off
in al, dx
and al, &HFC
out dx, al
End Asm
End Sub
Sub Sound(Byval freq As Uinteger, dur As Uinteger)
#ifndef __fb_win32__
' If not windows Then call the asm version.
Sound_DOS_LIN(freq, dur)
#Else
' If Windows
Dim osv As OSVERSIONINFO
osv.dwOSVersionInfoSize = Sizeof(OSVERSIONINFO)
GetVersionEx(@osv)
Select Case osv.dwPlatformId
Case VER_PLATFORM_WIN32_NT
' If NT then use Beep from API
Beep_(freq, dur)
Case Else
' If not on NT then use the same as DOS/Linux
Sound_DOS_LIN(freq, dur)
End Select
#endif
End Sub
'----------
Sound(262, 250) 'C4
Sound(294, 250) 'D4
Sound(330, 250) 'E4
Sound(349, 250) 'F4
Sound(392, 250) 'G4
Sound(440, 250) 'A4
Sound(494, 250) 'B4
Sound(523, 250) 'C5
Sleep

View file

@ -0,0 +1,262 @@
output file "FB Piano Keyboard"
include "Tlbx AudioToolbox.incl"
_window = 1
begin enum output 1
_whiteKey01
_whiteKey02
_whiteKey03
_whiteKey04
_whiteKey05
_whiteKey06
_whiteKey07
_whiteKey08
_whiteKey09
_whiteKey10
_whiteKey11
_whiteKey12
_whiteKey13
_whiteKey14
_whiteKey15
_whiteKey16
_whiteKey17
_whiteKey18
_whiteKey19
_whiteKey20
_whiteKey21
_whiteKey22
_blackKey23
_blackKey24
_blackKey25
_blackKey26
_blackKey27
_blackKey28
_blackKey29
_blackKey30
_blackKey31
_blackKey32
_blackKey33
_blackKey34
_blackKey35
_blackKey36
_blackKey37
_infoField
_playBtn
_note01
_note02
_note03
_note04
_note05
_note06
_note07
_note08
_note09
_note10
_note11
_note12
_note13
_note14
_note15
_note16
_note17
_note18
_note19
_note20
_note21
_note22
end enum
begin enum output
_kMidiMessageControlChange = 0xB
_kMidiMessageProgramChange = 0xC
_kMidiMessageBankMSBControl = 0
_kMidiMessageBankLSBControl = 32
_kMidiMessageNoteOn = 0x9
end enum
BeginCDeclaration
AudioUnit synthUnit;
AUGraph graph;
EndC
void local fn PlayNote( noteNum as UInt32 )
BeginCCode
UInt8 midiChannelInUse = 0;
MusicDeviceMIDIEvent( synthUnit, kMidiMessageControlChange << 4 | midiChannelInUse, kMidiMessageBankMSBControl, 0, 0 ); //2022-Jan-04 Brian
MusicDeviceMIDIEvent( synthUnit, kMidiMessageProgramChange << 4 | midiChannelInUse, 0, 0, 0 );
AUGraphStart( graph );
UInt32 onVelocity = 127;
UInt32 noteOnCommand = kMidiMessageNoteOn << 4 | midiChannelInUse; //2022-Jan-04 Brian
MusicDeviceMIDIEvent( synthUnit, noteOnCommand, noteNum, onVelocity, 0 );
usleep ( 1 * 500 * 600 ); // 0.6 second sleep
MusicDeviceMIDIEvent( synthUnit, noteOnCommand, noteNum, 0, 0);
EndC
end fn
void local fn InitializeSynth
BeginCCode
AUNode synthNode, limiterNode, outNode;
AudioComponentDescription cd;
graph = 0;
synthUnit = 0;
cd.componentManufacturer = kAudioUnitManufacturer_Apple;
cd.componentFlags = 0;
cd.componentFlagsMask = 0;
NewAUGraph (&graph);
cd.componentType = kAudioUnitType_MusicDevice;
cd.componentSubType = kAudioUnitSubType_DLSSynth;
AUGraphAddNode (graph, &cd, &synthNode);
cd.componentType = kAudioUnitType_Effect;
cd.componentSubType = kAudioUnitSubType_PeakLimiter;
AUGraphAddNode (graph, &cd, &limiterNode);
cd.componentType = kAudioUnitType_Output;
cd.componentSubType = kAudioUnitSubType_DefaultOutput;
AUGraphAddNode (graph, &cd, &outNode);
AUGraphOpen (graph);
AUGraphConnectNodeInput (graph, synthNode, 0, limiterNode, 0);
AUGraphConnectNodeInput (graph, limiterNode, 0, outNode, 0);
AUGraphNodeInfo ( graph, synthNode, 0, &synthUnit );
AUGraphInitialize (graph);
EndC
end fn
local fn CreateKeyImage
CGRect r = {0,0,28,162}
ImageRef image = fn ImageWithSize( fn CGSizeMake( 28.0, 162.0 ) )
ImageLockFocus( image )
BezierPathFillRect( r, fn ColorBlack )
ImageUnlockFocus( image )
ImageSetName( image, @"KeyImage" )
end fn
void local fn BuildWindow
NSInteger i, count
NSInteger wndStyleMask = NSWindowStyleMaskTitled
wndStyleMask += NSWindowStyleMaskClosable
wndStyleMask += NSWindowStyleMaskMiniaturizable
CGRect r = {0,0,850,340}
window _window, @"FB Piano Keyboard", r, wndStyleMask
WindowSetBackgroundColor( _window, fn ColorWithRGB( 0.400, 0.400, 0.400, 1.0 ) )
// White keys
r = fn CGRectMake( 30, 30, 38, 250 )
for i = _whiteKey01 to _whiteKey22
button i,,,@"", r, NSButtonTypeMomentaryLight, NSBezelStyleTexturedSquare, _window
CALayerRef layer = fn CALayerInit
CALayerSetBackgroundColor( layer, fn ColorWithRGB( 0.800, 0.800, 0.800, 1.0 ) )
ViewSetWantsLayer( i, YES )
ViewSetLayer( i, layer )
r = fn CGRectOffset( r, 36, 0 )
next
// Black keys
r = fn CGRectMake( 52, 110, 28, 169 )
for i = _blackKey23 to _blackKey37
button i,,,@"", r, NSButtonTypeMomentaryLight, NSBezelStyleShadowlessSquare, _window
ButtonSetImageNamed( i, @"KeyImage" )
if ( i == 24 ) or ( i == 27 ) or ( i == 29 ) or ( i == 32 ) or ( i == 34 )
r = fn CGRectOffset( r, 72, 0 )
else
r = fn CGRectOffset( r, 36, 0 )
end if
next
r = fn CGRectMake( 30, 290, 240, 24 )
textfield _infoField,,,r, _window
TextFieldSetEditable( _infoField, NO )
TextFieldSetSelectable( _infoField, NO )
TextFieldSetDrawsBackground( _infoField, NO )
TextFieldSetBordered( _infoField, NO )
CFStringRef s = @"C,D,E,F,G,A,B,C,D,E,F,G,A,B,C,D,E,F,G,A,B,C"
CFArrayRef a = fn StringComponentsSeparatedByString( s, @"," )
r = fn CGRectMake( 30, 10, 38, 19 )
count = 0
for i = _note01 to _note22
textfield i,, fn ArrayObjectAtIndex( a, count ), r, _window
TextFieldSetDrawsBackground( i, NO )
TextFieldSetBordered( i, NO )
TextFieldSetEditable( i, NO )
TextFieldSetSelectable( i, NO )
TextSetAlignment( i, NSTextAlignmentCenter )
TextSetFontWithName( i, @"Menlo", 14.0 )
r = fn CGRectOffset( r, 36, 0 )
count++
next
end fn
local fn DoDialog( ev as NSUInteger, tag as NSUInteger, wnd as NSUInteger )
select (ev)
case _btnClick
select (tag)
case 1 : fn PlayNote( 53 ) : ControlSetStringValue( _infoField, @"C, Note 53, White key No. 1" )
case 2 : fn PlayNote( 55 ) : ControlSetStringValue( _infoField, @"D, Note 55, White key No. 2" )
case 3 : fn PlayNote( 57 ) : ControlSetStringValue( _infoField, @"E, Note 57, White key No. 3" )
case 4 : fn PlayNote( 58 ) : ControlSetStringValue( _infoField, @"F, Note 58, White key No. 4" )
case 5 : fn PlayNote( 60 ) : ControlSetStringValue( _infoField, @"G, Note 60, White key No. 5" )
case 6 : fn PlayNote( 62 ) : ControlSetStringValue( _infoField, @"A, Note 62, White key No. 6" )
case 7 : fn PlayNote( 64 ) : ControlSetStringValue( _infoField, @"B, Note 64, White key No. 7" )
case 8 : fn PlayNote( 65 ) : ControlSetStringValue( _infoField, @"C, Note 65, White key No. 8" )
case 9 : fn PlayNote( 67 ) : ControlSetStringValue( _infoField, @"D, Note 67, White key No. 9" )
case 10 : fn PlayNote( 69 ) : ControlSetStringValue( _infoField, @"E, Note 69, White key No. 10" )
case 11 : fn PlayNote( 70 ) : ControlSetStringValue( _infoField, @"F, Note 70, White key No. 11" )
case 12 : fn PlayNote( 72 ) : ControlSetStringValue( _infoField, @"G, Note 72, White key No. 12" )
case 13 : fn PlayNote( 74 ) : ControlSetStringValue( _infoField, @"A, Note 74, White key No. 13" )
case 14 : fn PlayNote( 76 ) : ControlSetStringValue( _infoField, @"B, Note 76, White key No. 14" )
case 15 : fn PlayNote( 77 ) : ControlSetStringValue( _infoField, @"C, Note 77, White key No. 15" )
case 16 : fn PlayNote( 79 ) : ControlSetStringValue( _infoField, @"D, Note 79, White key No. 16" )
case 17 : fn PlayNote( 81 ) : ControlSetStringValue( _infoField, @"E, Note 81, White key No. 17" )
case 18 : fn PlayNote( 82 ) : ControlSetStringValue( _infoField, @"F, Note 82, White key No. 18" )
case 19 : fn PlayNote( 84 ) : ControlSetStringValue( _infoField, @"G, Note 84, White key No. 19" )
case 20 : fn PlayNote( 86 ) : ControlSetStringValue( _infoField, @"A, Note 86, White key No. 20" )
case 21 : fn PlayNote( 88 ) : ControlSetStringValue( _infoField, @"B, Note 88, White key No. 21" )
case 22 : fn PlayNote( 89 ) : ControlSetStringValue( _infoField, @"C, Note 88, White key No. 22" )
case 23 : fn PlayNote( 54 ) : ControlSetStringValue( _infoField, @"C#/D\u266D, Note 54, Black key No. 23" )
case 24 : fn PlayNote( 56 ) : ControlSetStringValue( _infoField, @"D#/E\u266D, Note 56, Black key No. 24" )
case 25 : fn PlayNote( 59 ) : ControlSetStringValue( _infoField, @"F#/G\u266D, Note 59, Black key No. 25" )
case 26 : fn PlayNote( 61 ) : ControlSetStringValue( _infoField, @"G#/A\u266D, Note 61, Black key No. 26" )
case 27 : fn PlayNote( 63 ) : ControlSetStringValue( _infoField, @"A#/B\u266D, Note 63, Black key No. 27" )
case 28 : fn PlayNote( 66 ) : ControlSetStringValue( _infoField, @"C#/D\u266D, Note 66, Black key No. 28" )
case 29 : fn PlayNote( 68 ) : ControlSetStringValue( _infoField, @"D#/E\u266D, Note 68, Black key No. 29" )
case 30 : fn PlayNote( 71 ) : ControlSetStringValue( _infoField, @"F#/G\u266D, Note 71, Black key No. 30" )
case 31 : fn PlayNote( 73 ) : ControlSetStringValue( _infoField, @"G#/A\u266D, Note 73, Black key No. 31" )
case 32 : fn PlayNote( 75 ) : ControlSetStringValue( _infoField, @"A#/B\u266D, Note 75, Black key No. 32" )
case 33 : fn PlayNote( 78 ) : ControlSetStringValue( _infoField, @"C#/C\u266D, Note 78, Black key No. 33" )
case 34 : fn PlayNote( 80 ) : ControlSetStringValue( _infoField, @"D#/E\u266D, Note 80, Black key No. 34" )
case 35 : fn PlayNote( 83 ) : ControlSetStringValue( _infoField, @"F#/G\u266D, Note 83, Black key No. 35" )
case 36 : fn PlayNote( 85 ) : ControlSetStringValue( _infoField, @"G#/A\u266D, Note 85, Black key No. 36" )
case 37 : fn PlayNote( 87 ) : ControlSetStringValue( _infoField, @"A#/B\u266D, Note 87, Black key No. 37" )
end select
case _windowWillClose : end
end select
end fn
void local fn DoAppEvent( ev as long )
select (ev)
case _appWillFinishLaunching
fn InitializeSynth
fn CreateKeyImage
fn BuildWindow
end select
end fn
on appevent fn DoAppEvent
on dialog fn DoDialog
HandleEvents

View file

@ -0,0 +1,67 @@
package main
import (
"encoding/binary"
"log"
"math"
"os"
"strings"
)
func main() {
const (
sampleRate = 44100
duration = 8
dataLength = sampleRate * duration
hdrSize = 44
fileLen = dataLength + hdrSize - 8
)
// buffers
buf1 := make([]byte, 1)
buf2 := make([]byte, 2)
buf4 := make([]byte, 4)
// WAV header
var sb strings.Builder
sb.WriteString("RIFF")
binary.LittleEndian.PutUint32(buf4, fileLen)
sb.Write(buf4) // file size - 8
sb.WriteString("WAVE")
sb.WriteString("fmt ")
binary.LittleEndian.PutUint32(buf4, 16)
sb.Write(buf4) // length of format data (= 16)
binary.LittleEndian.PutUint16(buf2, 1)
sb.Write(buf2) // type of format (= 1 (PCM))
sb.Write(buf2) // number of channels (= 1)
binary.LittleEndian.PutUint32(buf4, sampleRate)
sb.Write(buf4) // sample rate
sb.Write(buf4) // sample rate * bps(8) * channels(1) / 8 (= sample rate)
sb.Write(buf2) // bps(8) * channels(1) / 8 (= 1)
binary.LittleEndian.PutUint16(buf2, 8)
sb.Write(buf2) // bits per sample (bps) (= 8)
sb.WriteString("data")
binary.LittleEndian.PutUint32(buf4, dataLength)
sb.Write(buf4) // size of data section
wavhdr := []byte(sb.String())
// write WAV header
f, err := os.Create("notes.wav")
if err != nil {
log.Fatal(err)
}
defer f.Close()
f.Write(wavhdr)
// compute and write actual data
freqs := [8]float64{261.6, 293.6, 329.6, 349.2, 392.0, 440.0, 493.9, 523.3}
for j := 0; j < duration; j++ {
freq := freqs[j]
omega := 2 * math.Pi * freq
for i := 0; i < dataLength/duration; i++ {
y := 32 * math.Sin(omega*float64(i)/float64(sampleRate))
buf1[0] = byte(math.Round(y))
f.Write(buf1)
}
}
}

View file

@ -0,0 +1,2 @@
require'media/wav'
0.25 wavnote 0 2 4 5 7 9 11 12

View file

@ -0,0 +1,55 @@
import java.util.List;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
public final class MusicalScale {
public static void main(String[] aArgs) {
List<Double> frequencies = List.of( 261.63, 293.66, 329.63, 349.23, 392.00, 440.00, 493.88, 523.25 );
final int duration = 500;
final int volume = 1;
for ( int i = 0; i < 3; i++ ) {
for ( double frequency : frequencies ) {
musicalTone(frequency, duration, volume);
}
}
}
private static void musicalTone(double aFrequency, int aDuration, int aVolume) {
byte[] buffer = new byte[1];
AudioFormat audioFormat = getAudioFormat();
try ( SourceDataLine sourceDataLine = AudioSystem.getSourceDataLine(audioFormat) ) {
sourceDataLine.open(audioFormat);
sourceDataLine.start();
for ( int i = 0; i < aDuration * 8; i++ ) {
double angle = i / ( SAMPLE_RATE / aFrequency ) * 2 * Math.PI;
buffer[0] = (byte) ( Math.sin(angle) * 127 * aVolume );
sourceDataLine.write(buffer, BYTE_OFFSET, buffer.length);
}
sourceDataLine.drain();
sourceDataLine.stop();
sourceDataLine.close();
} catch (LineUnavailableException exception) {
exception.printStackTrace();
}
}
private static AudioFormat getAudioFormat() {
final int sampleSizeInBits = 8;
final int numberChannels = 1;
final boolean signedData = true;
final boolean isBigEndian = false;
return new AudioFormat(SAMPLE_RATE, sampleSizeInBits, numberChannels, signedData, isBigEndian);
}
private static float SAMPLE_RATE = 8_000.0F;
private static final int BYTE_OFFSET = 0;
}

View file

@ -0,0 +1,36 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Sample Page</title>
<script>
function musicalScale(freqArr){
// create web audio api context
var AudioContext = window.AudioContext || window.webkitAudioContext;
var audioCtx = new AudioContext();
// create oscillator and gain node
var oscillator = audioCtx.createOscillator();
var gainNode = audioCtx.createGain();
// connect oscillator to gain node to speakers
oscillator.connect(gainNode);
gainNode.connect(audioCtx.destination);
// set frequencies to play
duration = 0.5 // seconds
freqArr.forEach(function (freq, i){
oscillator.frequency.setValueAtTime(freq, audioCtx.currentTime + i * duration);
});
// start playing!
oscillator.start();
// stop playing!
oscillator.stop(audioCtx.currentTime + freqArr.length * duration);
}
</script>
</head>
<body>
<button onclick="musicalScale([261.63, 293.66, 329.63, 349.23, 392.00, 440.00, 493.88, 523.25]);">Play scale</button>
</body>
</html>

View file

@ -0,0 +1,25 @@
using PortAudio
function paudio()
devs = PortAudio.devices()
devnum = findfirst(x -> x.maxoutchans > 0, devs)
(devnum == nothing) && error("No output device for audio found")
return PortAudioStream(devs[devnum].name, 0, 2)
end
function play(ostream, pitch, durationseconds)
sinewave(t) = 0.6sin(t) + 0.2sin(2t) + .05sin(8t)
timesamples = 0:(1 / 44100):(durationseconds * 0.98)
v = Float64[sinewave(2π * pitch * t) for t in timesamples]
write(ostream, v)
sleep(durationseconds * 0.9)
end
# C major scale starting with middle C
# pitches from //pages.mtu.edu/~suits/notefreqs.html
const scale = [261.6, 293.7, 329.6, 349.2, 392, 440, 493.9, 523.3]
const ostream = paudio()
for pitch in scale
play(ostream, pitch, 0.5)
sleep(0.4)
end

View file

@ -0,0 +1,10 @@
// Kotlin Native v0.3
import kotlinx.cinterop.*
import win32.*
fun main(args: Array<String>) {
val freqs = intArrayOf(262, 294, 330, 349, 392, 440, 494, 523) // CDEFGABc
val dur = 500
repeat(5) { for (freq in freqs) Beep(freq, dur) }
}

View file

@ -0,0 +1,28 @@
Using the musicalScale() javascript function found in this wiki page, we build a lambdatalk interface to output the 8 notes of the C major diatonic scale, and more.
{def note
{lambda {:i}
{round {* 261.63 {pow 2 {/ :i 12}}}}}}
{def scale
{lambda {:notes}
[{S.map {lambda {:i} {note :i},} :notes}]}}
{def play
{lambda {:n}
{input {@ type="button"
value="Play :n"
onclick="musicalScale({scale :n});"}}}}
1) diatonic up
{play 0 2 4 5 7 9 11 12}
2) diatonic down
{play 12 11 9 7 5 4 2 0}
3) twelve notes of the octave plus one
{play {S.serie 0 12}}
4) one more ... from Fantasia (Disney Studios, 1940)
{play 0 2 3 5 7 3 7 7 6 2 6 6 7 3 7 7 0 2 3 5 7 3 7 12 10 7 3 7 10 10 10 10}
->

View file

@ -0,0 +1,5 @@
% Start at middle C
\relative c' {
c d e f
g a b c
}

View file

@ -0,0 +1,16 @@
10 mode 1
20 print "Note","Freq. (Hz)","Period"
30 ' program loop:
40 if sq(1)<128 then gosub 70 ' play next note if channel is inactive
50 goto 40
60 ' play next note
70 read n
80 if n<0 then end
90 note=note+1
100 ' calculation from chapter 7, page 26 of the CPC manual:
110 f=440*(2^((n-10)/12))
120 p=round(62500/f)
130 print mid$("cdefgabc",note,1),round(f,2),p
140 sound 1,p,100
150 return
160 data 1,3,5,6,8,10,12,13,-1

View file

@ -0,0 +1,14 @@
c = string.char
midi = "MThd" .. c(0,0,0,6,0,0,0,1,0,96) -- header
midi = midi .. "MTrk" .. c(0,0,0,8*8+4) -- track
for _,note in ipairs{60,62,64,65,67,69,71,72} do
midi = midi .. c(0, 0x90, note, 0x40, 0x60, 0x80, note, 0) -- notes
end
midi = midi .. c(0, 0xFF, 0x2F, 0) -- end
file = io.open("scale.mid", "wb")
file:write(midi)
file:close()
-- (optional: hex dump to screen)
midi:gsub(".", function(c) io.write(string.format("%02X ", string.byte(c))) end)

View file

@ -0,0 +1,27 @@
staff = {
lines = { "", "", "", "", "", "", "", "", "", "", "" },
nnotes = 0,
measure = function(self)
for i, line in ipairs(self.lines) do
self.lines[i] = line .. (i<#self.lines-1 and "|" or " ")
end
end,
play = function(self, note)
if self.nnotes%4==0 then self:measure() end
local n = #self.lines-note
for i, line in ipairs(self.lines) do
local linechar = (i%2==0) and " " or "-"
local fillchar = (i<#self.lines) and linechar or " "
self.lines[i] = line .. (i==n and linechar.."@"..linechar..fillchar or (i==n-1 or i==n-2) and string.rep(fillchar,2).."|"..fillchar or string.rep(fillchar,4))
end
self.nnotes = self.nnotes + 1
end,
dump = function(self)
for i, line in ipairs(self.lines) do print(line) end
end
}
for note = 0,7 do
staff:play(note)
end
staff:measure()
staff:dump()

View file

@ -0,0 +1,5 @@
beep = require"alien".kernel32.Beep
beep:types{ret='long', abi='stdcall', 'long', 'long'}
for _,step in ipairs{0,2,4,5,7,9,11,12} do
beep(math.floor(261.63 * 2^(step/12) + 0.5), 1000)
end

View file

@ -0,0 +1,14 @@
Module checkit {
\\ using internal speaker
TUNE 300, "C3DEFGABC4"
TUNE 300, "C3C#DD#EFF#GG#AA#BC4"
Thread {
score 10, 100, "CAC"
Play 10, 1
} as drums interval 1000
\\ Play in background (16 scores - no 10 for drum machine)
SCORE 1, 300, "C3DEFGABC4"
PLAY 1, 19 ' use score 1 with organ 19
Wait 2400
}
checkit

View file

@ -0,0 +1 @@
EmitSound@Sound[SoundNote /@ {0, 2, 4, 5, 7, 9, 11, 12}]

View file

@ -0,0 +1,8 @@
import tonegen
note_freqs = {261.63, 293.66, 329.63, 349.23, 392.00, 440.00, 493.88, 523.25}
tg = new(tonegen)
for freq in note_freqs
tg.beep(freq)
end

View file

@ -0,0 +1,52 @@
import endians, math
const
SampleRate = 44100
Duration = 8
DataLength = SampleRate * Duration
HdrSize = 44
FileLen = DataLength + HdrSize - 8
Bps = 8
Channels = 1
proc writeUint16(f: File; x: uint16) =
var x = x
var y: array[2, byte]
littleEndian16(y.addr, x.addr)
let n = f.writeBytes(y, 0, 2)
doAssert n == 2
proc writeUint32(f: File; x: uint32) =
var x = x
var y: array[4, byte]
littleEndian32(y.addr, x.addr)
let n = f.writeBytes(y, 0, 4)
doAssert n == 4
let file = open("notes.wav", fmWrite)
# Wav header.
file.write "RIFF"
file.writeUint32(FileLen)
file.write "WAVE"
file.write "fmt "
file.writeUint32(16) # length of format data.
file.writeUint16(1) # type of format(PCM).
file.writeUint16(Channels)
file.writeUint32(SampleRate)
file.writeUint32(SampleRate * Bps * Channels div 8)
file.writeUint16(Bps * Channels div 8)
file.writeUint16(Bps)
file.write "data"
file.writeUint32(DataLength) # size of data section.
# Compute and write actual data.
const Freqs = [261.6, 293.6, 329.6, 349.2, 392.0, 440.0, 493.9, 523.3]
for freq in Freqs:
let omega = 2 * Pi * freq
for i in 0..<(DataLength div Duration):
let y = (32 * sin(omega * i.toFloat / SampleRate.toFloat)).toInt
file.write chr(y.byte) # Signed int to byte then to char as its easier this way.
file.close()

View file

@ -0,0 +1,34 @@
/* REXX ---------------------------------------------------------------
* 24.02.2013 Walter Pachl derived from original REXX version
* Changes: sound(f,sec) --> beep(trunc(f),millisec)
* $ -> sc
* @. -> f.
* re > ra (in sc)
*--------------------------------------------------------------------*/
sc='do ra mi fa so la te do'
dur=1250 /* milliseconds */
Do j=1 For words(sc) /* sound each "note" in the string*/
Call notes word(sc,j),dur /* invoke a subroutine for sounds.*/
End /* j */
Exit /* stick a fork in it, we're done.*/
notes: Procedure
Arg note,dur
f.=0 /* define common names for sounds.*/
f.la=220
f.si=246.94
f.te=f.si
f.ta=f.te
f.ti=f.te
f.do=261.6256
f.ut=f.do
f.ra=293.66
f.re=f.ra /* re is to be a synonym for ra */
f.mi=329.63
f.ma=f.mi
f.fa=349.23
f.so=392
f.sol=f.so
Say note trunc(f.note) dur
If f.note\==0 Then
Call beep trunc(f.note),dur /* sound the "note". */
Return

View file

@ -0,0 +1,9 @@
use MIDI::Simple;
# setup, 1 quarter note is 0.5 seconds (500,000 microseconds)
set_tempo 500_000;
# C-major scale
n 60; n 62; n 64; n 65; n 67; n 69; n 71; n 72;
write_score 'scale.mid';

View file

@ -0,0 +1,28 @@
(phixonline)-->
<span style="color: #000080;font-style:italic;">--
-- demo\rosetta\Musical_scale.exw
--</span>
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">include</span> <span style="color: #000000;">pGUI</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
<span style="color: #008080;">include</span> <span style="color: #000000;">builtins</span><span style="color: #0000FF;">\</span><span style="color: #7060A8;">beep</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">freq</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">261.63</span><span style="color: #0000FF;">,</span><span style="color: #000000;">293.66</span><span style="color: #0000FF;">,</span><span style="color: #000000;">329.63</span><span style="color: #0000FF;">,</span><span style="color: #000000;">349.23</span><span style="color: #0000FF;">,</span><span style="color: #000000;">392</span><span style="color: #0000FF;">,</span><span style="color: #000000;">440</span><span style="color: #0000FF;">,</span><span style="color: #000000;">493.88</span><span style="color: #0000FF;">,</span><span style="color: #000000;">523.25</span><span style="color: #0000FF;">},</span>
<span style="color: #000000;">durations</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">500</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">freq</span><span style="color: #0000FF;">)-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">&</span> <span style="color: #000000;">1000</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">button_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000080;font-style:italic;">/*playbtn*/</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">beep</span><span style="color: #0000FF;">(</span><span style="color: #000000;">freq</span><span style="color: #0000FF;">,</span><span style="color: #000000;">durations</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0.5</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_DEFAULT</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #7060A8;">IupOpen</span><span style="color: #0000FF;">()</span>
<span style="color: #004080;">Ihandle</span> <span style="color: #000000;">label</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupLabel</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Please don't shoot the piano player, he's doing the best that he can!"</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">playbtn</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupButton</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Play"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"button_cb"</span><span style="color: #0000FF;">),</span><span style="color: #008000;">"PADDING=30x0"</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">hbox</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupHbox</span><span style="color: #0000FF;">({</span><span style="color: #7060A8;">IupFill</span><span style="color: #0000FF;">(),</span><span style="color: #000000;">playbtn</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">IupFill</span><span style="color: #0000FF;">()},</span><span style="color: #008000;">"MARGIN=0x20"</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">vbox</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupVbox</span><span style="color: #0000FF;">({</span><span style="color: #000000;">label</span><span style="color: #0000FF;">,</span><span style="color: #000000;">hbox</span><span style="color: #0000FF;">},</span> <span style="color: #008000;">"MARGIN=10x5, GAP=5"</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">dlg</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupDialog</span><span style="color: #0000FF;">(</span><span style="color: #000000;">vbox</span><span style="color: #0000FF;">,</span><span style="color: #008000;">`TITLE="Musical Scale"`</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">IupShow</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dlg</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()!=</span><span style="color: #004600;">JS</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">IupMainLoop</span><span style="color: #0000FF;">()</span>
<span style="color: #7060A8;">IupClose</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<!--

View file

@ -0,0 +1,4 @@
$frequencies = 261.63, 293.66, 329.63, 349.23, 392.00, 440.00, 493.88, 523.25
foreach($tone in $frequencies){
[Console]::beep($tone, 500)
}

View file

@ -0,0 +1,18 @@
//Aamrun, 2nd July 2022
import processing.sound.*;
float[] frequencies = {261.63, 293.66, 329.63, 349.23, 392.00, 440.00, 493.88, 523.25};
SinOsc sine;
size(500,500);
sine = new SinOsc(this);
for(int i=0;i<frequencies.length;i++){
sine.freq(frequencies[i]);
sine.play();
delay(500);
}

View file

@ -0,0 +1,4 @@
>>> import winsound
>>> for note in [261.63, 293.66, 329.63, 349.23, 392.00, 440.00, 493.88, 523.25]:
winsound.Beep(int(note+.5), 500)
>>>

View file

@ -0,0 +1,7 @@
install.packages("audio")
library(audio)
hz=c(1635,1835,2060,2183,2450,2750,3087,3270)
for (i in 1:8){
play(audioSample(sin(1:1000), hz[i]))
Sys.sleep(.7)
}

View file

@ -0,0 +1,38 @@
/*REXX program sounds eight notes of the C major natural diatonic music scale.*/
parse arg ! /*obtain optional arguments from the CL*/
/* [↓] invoke boilerplate REXX code. */
if !all( arg() ) then exit /*determine which REXX is running, if */
/* any form of help requested, exit.*/
if \!regina & \!pcrexx then do
say "***error*** this program can't execute under:" !ver
exit 13
end
$ = 'do ra me fa so la te do' /*the words for music scale sounding. */
dur = 1/4 /*define duration as a quarter second. */
do j=1 for words($) /*sound each "note" in the string. */
call notes word($, j), dur /*invoke a subroutine for the sounds. */
end /*j*/ /* [↑] sound each of the words. */
exit 0 /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
notes: procedure expose !regina !pcrexx; arg note,dur /*obtain the arguments from list. */
@.= 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; @.ra= @.re; @.mi= 329.63
@.ma= @.mi; @.fa= 349.23; @.so= 392; @.sol= @.so
if @.note==0 then return /*if frequency is zero, skip it. */
if !pcrexx then call sound @.note,dur /*sound the note using SOUND bif. */
if !regina then do /* [↓] reformat some numbers. */
ms= format(dur*1000, , 0) /*Regina requires DUR in millisec.*/
intN= format(@.note, , 0) /* " " NOTE is integer.*/
call beep intN, ms /*sound the note using BEEP BIF.*/
end
return
/*─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────*/
!all: !!=!;!=space(!);upper !;call !fid;!nt=right(!var('OS'),2)=='NT';!cls=word('CLS VMFCLEAR CLRSCREEN',1+!cms+!tso*2);if arg(1)\==1 then return 0;if wordpos(!,'? ?SAMPLES ?AUTHOR ?FLOW')==0 then return 0;!call=']$H';call '$H' !fn !;!call=;return 1
!cal: if symbol('!CALL')\=="VAR" then !call=; return !call
!env: !env= 'ENVIRONMENT'; if !sys=="MSDOS" | !brexx | !r4 | !roo then !env= 'SYSTEM'; if !os2 then !env= "OS2"!env; !ebcdic= 3=='f3'x; if !crx then !env="DOS"; return
!fid: parse upper source !sys !fun !fid . 1 . . !fn !ft !fm .; call !sys; if !dos then do; _= lastpos('\',!fn); !fm= left(!fn,_); !fn= substr(!fn,_+1); parse var !fn !fn "." !ft; end; return word(0 !fn !ft !fm, 1 + ('0'arg(1) ) )
!rex: parse upper version !ver !vernum !verdate .; !brexx= 'BY'==!vernum; !kexx= "KEXX"==!ver; !pcrexx= 'REXX/PERSONAL'==!ver | "REXX/PC"==!ver; !r4= 'REXX-R4'==!ver; !regina= "REXX-REGINA"==left(!ver, 11); !roo= 'REXX-ROO'==!ver; call !env; return
!sys: !cms= !sys=='CMS'; !os2= !sys=="OS2"; !tso= !sys=='TSO' | !sys=="MVS"; !vse= !sys=='VSE'; !dos= pos("DOS", !sys)\==0 | pos('WIN', !sys)\==0 | !sys=="CMD"; !crx= left(!sys, 6)=='DOSCRX'; call !rex; return
!var: call !fid; if !kexx then return space( dosenv( arg(1) ) ); return space( value( arg(1), , !env) )

View file

@ -0,0 +1,11 @@
#lang racket
(require ffi/unsafe ffi/unsafe/define)
(define-ffi-definer defmm (ffi-lib "Winmm"))
(defmm midiOutOpen (_fun [h : (_ptr o _int32)] [_int = -1] [_pointer = #f]
[_pointer = #f] [_int32 = 0] -> _void -> h))
(defmm midiOutShortMsg (_fun _int32 _int32 -> _void))
(define M (midiOutOpen))
(define (midi x y z) (midiOutShortMsg M (+ x (* 256 y) (* 65536 z))))
(for ([i '(60 62 64 65 67 69 71 72)]) (midi #x90 i 127) (sleep 0.5))
(sleep 2)

View file

@ -0,0 +1,3 @@
for 0,2,4,5,7,9,11,12 {
shell "play -n -c1 synth 0.2 sin %{$_ - 9}"
}

View file

@ -0,0 +1,8 @@
# Project : Musical scale
loadlib("C:\Ring\extensions\ringbeep\ringbeep.dll")
freqs = [[262,"Do"], [294,"Ra"], [330,"Me"], [349,"Fa"], [392,"So"], [440,"La"], [494,"Te"], [523,"do"]]
for f = 1 to len(freqs)
see freqs[f][2] + nl
beep(freqs[f][1],300)
next

View file

@ -0,0 +1,12 @@
import net.java.dev.sna.SNA
object PlayMusicScale extends App with SNA {
snaLibrary = "Kernel32"
val Beep = SNA[Int, Int, Unit]
println("Please don't shoot the piano player, he's doing the best that he can!")
List(0, 2, 4, 5, 7, 9, 11, 12).
foreach(f => Beep((261.63 * math.pow(2, f / 12.0)).toInt, if (f == 12) 1000 else 500))
println("That's all")
}

View file

@ -0,0 +1,50 @@
var sampleRate = 44100.0;
var duration = 8.0;
var dataLength = round(sampleRate * duration);
var dataLength_b0 = dataLength >> 0 & 0xff;
var dataLength_b1 = dataLength >> 8 & 0xff;
var dataLength_b2 = dataLength >> 16 & 0xff;
var dataLength_b3 = dataLength >> 24 & 0xff;
const adjustedHdrSize = 36;
var len = dataLength - adjustedHdrSize;
var len_b0 = len >> 0 & 0xff;
var len_b1 = len >> 8 & 0xff;
var len_b2 = len >> 16 & 0xff;
var len_b3 = len >> 24 & 0xff;
// WAV header
var wavhdr = "RIFF";
wavhdr ..= fmtstr("%c%c%c%c", len_b0, len_b1, len_b2, len_b3);
wavhdr ..= "WAVE";
wavhdr ..= "fmt ";
wavhdr ..= "\x10\x00\x00\x00";
wavhdr ..= "\x01\x00";
wavhdr ..= "\x01\x00";
wavhdr ..= "\x44\xac\x00\x00";
wavhdr ..= "\x44\xac\x00\x00";
wavhdr ..= "\x01\x00";
wavhdr ..= "\x08\x00";
wavhdr ..= "data";
wavhdr ..= fmtstr("%c%c%c%c", dataLength_b0, dataLength_b1, dataLength_b2, dataLength_b3);
// write wav header
var f = fopen("notes.wav", "w");
fwrite(f, wavhdr);
// compute and write actual data
var frequs = { 261.6, 293.6, 329.6, 349.2, 392.0, 440.0, 493.9, 523.3 };
for var j = 0; j < duration; j++ {
var frequ = frequs[j];
var omega = 2 * M_PI * frequ;
for var i = 0; i < dataLength / 8; i++ {
var y = 32 * sin(omega * i / sampleRate);
var byte = fmtstr("%c", round(y));
fwrite(f, byte);
}
}
fclose(f);

View file

@ -0,0 +1,23 @@
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}]
}

View file

@ -0,0 +1,6 @@
decl double<> notes
append 261.63 293.66 329.63 349.23 392.00 440.00 493.88 523.25 notes
for (decl int i) (< i (size notes)) (inc i)
ursa.util.sound.beep notes<i> 0.5
end for

View file

@ -0,0 +1,61 @@
import strings
import os
import encoding.binary
import math
const (
sample_rate = 44100
duration = 8
data_length = sample_rate * duration
hdr_size = 44
file_len = data_length + hdr_size - 8
)
fn main() {
// buffers
mut buf1 := []byte{len:1}
mut buf2 := []byte{len:2}
mut buf4 := []byte{len:4}
// WAV header
mut sb := strings.new_builder(128)
sb.write_string("RIFF")
binary.little_endian_put_u32(mut &buf4, file_len)
sb.write(buf4)? // file size - 8
sb.write_string("WAVE")
sb.write_string("fmt ")
binary.little_endian_put_u32(mut &buf4, 16)
sb.write(buf4)? // length of format data (= 16)
binary.little_endian_put_u16(mut &buf2, 1)
sb.write(buf2)? // type of format (= 1 (PCM))
sb.write(buf2)? // number of channels (= 1)
binary.little_endian_put_u32(mut &buf4, sample_rate)
sb.write(buf4)? // sample rate
sb.write(buf4)? // sample rate * bps(8) * channels(1) / 8 (= sample rate)
sb.write(buf2)? // bps(8) * channels(1) / 8 (= 1)
binary.little_endian_put_u16(mut &buf2, 8)
sb.write(buf2)? // bits per sample (bps) (= 8)
sb.write_string("data")
binary.little_endian_put_u32(mut &buf4, data_length)
sb.write(buf4)? // size of data section
wavhdr := sb.str().bytes()
// write WAV header
mut f := os.create("notes.wav")?
defer {
f.close()
}
f.write(wavhdr)?
// compute and write actual data
freqs := [261.6, 293.6, 329.6, 349.2, 392.0, 440.0, 493.9, 523.3]!
for j in 0..duration {
freq := freqs[j]
omega := 2 * math.pi * freq
for i in 0..data_length/duration {
y := 32 * math.sin(omega*f64(i)/f64(sample_rate))
buf1[0] = u8(math.round(y))
f.write(buf1)?
}
}
}

View file

@ -0,0 +1,11 @@
Option Explicit
Declare Function Beep Lib "kernel32" (ByVal Freq As Long, ByVal Dur As Long) As Long
Sub Musical_Scale()
Dim Fqs, i As Integer
Fqs = Array(264, 297, 330, 352, 396, 440, 495, 528)
For i = LBound(Fqs) To UBound(Fqs)
Beep Fqs(i), 500
Next
End Sub

View file

@ -0,0 +1,15 @@
import "/sound" for Wav
var sampleRate = 44100
var duration = 8
var data = List.filled(sampleRate * duration, 0)
var freqs = [261.6, 293.6, 329.6, 349.2, 392.0, 440.0, 493.9, 523.3]
for (j in 0...duration) {
var freq = freqs[j]
var omega = 2 * Num.pi * freq
for (i in 0...sampleRate) {
var y = (32 * (omega * i / sampleRate).sin).round & 255
data[i + j * sampleRate] = y
}
}
Wav.create("musical_scale.wav", data, sampleRate)

View file

@ -0,0 +1,16 @@
import "audio" for AudioEngine
class Main {
construct new() {}
init() {
AudioEngine.load("doremi", "musical_scale.wav")
AudioEngine.play("doremi")
}
update() {}
draw(alpha) {}
}
var Game = Main.new()

View file

@ -0,0 +1,21 @@
\Square waves on the beeper speaker:
code Sound=39;
real Period; int I;
[Period:= 1190000.0/261.625565; \middle C
for I:= 2 to 9 do
[Sound(1, 4, fix(Period)); \times 2^(-1/6) else 2^(-1/12)
Period:= Period * (if I&3 then 0.890898719 else 0.943874313);
];
]
\MIDI grand piano (requires 32-bit Windows or Sound Blaster 16):
code Sound=39;
int Note, I;
[port($331):= $3F; \set MPU-401 into UART mode
Note:= 60; \start at middle C
for I:= 2 to 9+1 do \(last note is not played)
[port($330):= $90; port($330):= Note; port($330):= $7F;
Sound(0, 4, 1); \This "Sound" is off, but convenient 0.22 sec delay
Note:= Note + (if I&3 then 2 else 1);
];
]

View file

@ -0,0 +1,54 @@
// Rosetta Code problem: http://rosettacode.org/wiki/Musical_scale
// by Galileo, 03/2022
sample_rate = 44100
duration = 8
dataLength = sample_rate * duration
hdrSize = 44
fileLen = dataLength + hdrSize - 8
data 261.6, 293.6, 329.6, 349.2, 392.0, 440.0, 493.9, 523.3
sub int_to_bytes(dato, long)
local dato$, esp, esp$, i
esp$ = "00000000"
dato$ = hex$(dato)
esp = long * 2
dato$ = right$(esp$ + dato$, esp)
for i = esp - 1 to 1 step -2
poke #fn, dec(mid$(dato$, i, 2))
next
end sub
fn = open("notesyab.wav", "wb")
print #fn, "RIFF";
int_to_bytes(fileLen, 4)
print #fn, "WAVEfmt ";
int_to_bytes(16, 4) // length of format data (= 16)
int_to_bytes(1, 2) // type of format (= 1 (PCM))
int_to_bytes(1, 2) // number of channels (= 1)
int_to_bytes(sample_rate, 4) // sample rate
int_to_bytes(sample_rate, 4) // sample rate * bps(8) * channels(1) / 8 (= sample rate)
int_to_bytes(1,2) // bps(8) * channels(1) / 8 (= 1)
int_to_bytes(8,2) // bits per sample (bps) (= 8)
print #fn, "data";
int_to_bytes(dataLength, 4) // size of data section
for j = 1 to duration
read f
omega = 2 * PI * f
for i = 0 to dataLength/duration-1
y = 32 * sin(omega * i / sample_rate)
byte = and(y, 255)
poke #fn, byte
next
next
close(fn)
if peek$("os") = "windows" then
system("notesyab.wav")
else // Linux
system("aplay notesyab.wav")
endif

View file

@ -0,0 +1,10 @@
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