Code archives/Audio/Recording example - Sample based piano
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| Example use of audio functions library. Find it in the audio section of the code archives. | |||||
;Recording Samples using Blitz and Windows MCI Functions.
;
;ADAmor ZILTCH 20 Aug 2003
Include "audio.bb"
Graphics 640,400,32,2
SetBuffer BackBuffer()
Global LastNote$ = ""
Global Octave = 2
Global Capinc = 1
SampleFreq = 44100
Dim KeyDownTime(255)
Dim Waverecorded(11)
Dim Whitekeys.keynote(59)
Dim Blackkeys.keynote(44)
start = MilliSecs()
snd=LoadSound("E:\AUDIO\WAV\Acoustic Instruments\Strings\Viola.wav")
;^^ Put any sample here. This is for the piano keyboard.
; This sample is not Altered in any way.
SetupKeyboard()
While Not KeyHit(1)
Cls
Color 255,250,250
Text 10,100,"Keyboard is laid out like piano"
Text 10,180,"Use the Mouse wheel to change octave"
Text 10,220,"[R] to Start/Stop Next Recording"
Text 10,240,"[1234567890] For Recording Playback"
Text 10,260,"[esc] to exit"
Color 25,20,150
Text 15,120,"SD GHJ L;' are the Black keys"
Color 85,80,150
Text 10,140,"ZXCVBNM,./ are the White keys"
octave = Abs(MouseZ() Mod 5) ;Start Note for range
Freq = CheckPiano(SampleFreq,octave)
KeyPressed = GetKey()
now = MilliSecs() - start
If Freq > 0 Then
If (Now - KeyDownTime(KeyPressed)) => Freq/1100 Then
ch=PlaySound(snd)
ChannelPitch ch,Freq
KeyDownTime(KeyPressed) = now
LastFreq = Freq
EndIf
EndIf
RecordingStatus$ = CaptureStatusMode$()
If KeyHit(19) Then
;Stop recording
If RecordingStatus$ = "recording" Then
StopWAVrecord()
SaveWAVrecord("Stest"+(Capinc+1)+".wav")
; Saved as Stest'x'.wav in current directory.
Waverecorded(Capinc) = True
; Create a new capure alias so we can play previous samples and record new ones
Capinc = Capinc + 1
CaptureAlias$ = "Capture"+Capinc
Else
; Start recording, set Sample Bits per sample and Frequency (Samples per second)
StartWAVrecord(16,44100)
; Capture time format 0 = bytes
; 1 = milliseconds
; 2 = samples
SetCaptureTimeFormat$(1)
End If
End If
For playkey = 2 To 11
If KeyHit(playkey) And Waverecorded(playkey-1) Then
; This plays the recorded Samples when
; User hits a number (1234567890) key
PlayrecordedWAV("Capture"+Str(playkey-1))
DebugLog "Playing Capture"+Str(playkey-1)
End If
Next
If RecordingStatus$ = "recording" Then
Color 155,250,250
Text 10,10,"Record pos " + Str( CaptureWavPos()*100) + " "+ StatusCapTimeFormat$()+ "."
End If
Color 255,150,150
Text 10,30,"Hz "+ LastFreq + " Note " + LastNote$
Color 255,80,50
Text 10,75, RecordingStatus$
Flip False
Wend
CloseAllWAVrecord()
End
Function CheckPiano(SampleFreq,octave=3)
For numkey = 44 To 53
If KeyHit(numkey) Then
FreqPitch = Whitekeys(numkey-43+octave*7)\Freq*1000
LastNote$ = Whitekeys(numkey-43+octave*7)\name$
End If
Next
Bcount = octave*5
For numkey = 31 To 40
Select numkey
Case 33,37 ;skip some keys
; numkey = numkey +1
Default
Bcount = Bcount + 1
If KeyHit(numkey) Then
FreqPitch = blackkeys(bcount)\Freq*1000
LastNote$ = blackkeys(bcount)\name$
End If
End Select
Next
Return FreqPitch
End Function
Type KeyNote
Field name$,Freq#,wave
End Type
Function SetupKeyboard()
Restore pianokeys
For count = 0 To 99
tn.keynote = New keynote
Read tn\name
Read tn\Freq
Read tn\wave
If Mid$(tn\name,2,1) = "#" Then
Bcount = Bcount + 1
Blackkeys.keynote(Bcount) = tn
Else
Wcount = Wcount + 1
Whitekeys.keynote(Wcount) = tn
End If
DebugLog "Wcount = "+ Wcount
Next
End Function
.pianokeys
Data "C0",16.35,2100.
Data "C#0/Db0",17.32,1990.
Data "D0",18.35,1870.
Data "D#0/Eb0",19.45,1770.
Data "E0",20.60,1670.
Data "F0",21.83,1580.
Data "F#0/Gb0",23.12,1490.
Data "G0",24.50,1400.
Data "G#0/Ab0",25.96,1320.
Data "A0",27.50,1250.
Data "A#0/Bb0",29.14,1180.
Data "B0",30.87,1110.
Data "C1",32.70,1050.
Data "C#1/Db1",34.65,996.
Data "D1",36.71,940.
Data "D#1/Eb1",38.89,887.
Data "E1",41.20,837.
Data "F1",43.65,790.
Data "F#1/Gb1",46.25,746.
Data "G1",49.00,704.
Data "G#1/Ab1",51.91,666.
Data "A1",55.00,627.
Data "A#1/Bb1",58.27,592.
Data "B1",61.74,559.
Data "C2",65.41,527.
Data "C#2/Db2",69.30,498.
Data "D2",73.42,470.
Data "D#2/Eb2",77.78,444.
Data "E2",82.41,419.
Data "F2",87.31,395.
Data "F#2/Gb2",92.50,373.
Data "G2",98.00,352.
Data "G#2/Ab2",103.83,332.
Data "A2",110.00,314.
Data "A#2/Bb2",116.54,296.
Data "B2",123.47,279.
Data "C3",130.81,264.
Data "C#3/Db3",138.59,249.
Data "D3",146.83,235.
Data "D#3/Eb3",155.56,222.
Data "E3",164.81,209.
Data "F3",174.61,198.
Data "F#3/Gb3",185.00,186.
Data "G3",196.00,176.
Data "G#3/Ab3",207.65,166.
Data "A3",220.00,157.
Data "A#3/Bb3",233.08,148.
Data "B3",246.94,140.
Data "C4",261.63,132.
Data "C#4/Db4",277.18,124.
Data "D4",293.66,117.
Data "D#4/Eb4",311.13,111.
Data "E4",329.63,105.
Data "F4",349.23,98.8
Data "F#4/Gb4",369.99,93.2
Data "G4",392.00,88.0
Data "G#4/Ab4",415.30,83.1
Data "A4",440.00,78.4
Data "A#4/Bb4",466.16,74.0
Data "B4",493.88,69.9
Data "C5",523.25,65.9
Data "C#5/Db5",554.37,62.2
Data "D5",587.33,58.7
Data "D#5/Eb5",622.25,55.4
Data "E5",659.26,52.3
Data "F5",698.46,49.4
Data "F#5/Gb5",739.99,46.6
Data "G5",783.99,44.0
Data "G#5/Ab5",830.61,41.5
Data "A5",880.00,39.2
Data "A#5/Bb5",932.33,37.0
Data "B5",987.77,34.9
Data "C6",1046.50,33.0
Data "C#6/Db6",1108.73,31.1
Data "D6",1174.66,29.4
Data "D#6/Eb6",1244.51,27.7
Data "E6",1318.51,26.2
Data "F6",1396.91,24.7
Data "F#6/Gb6",1479.98,23.3
Data "G6",1567.98,22.0
Data "G#6/Ab6",1661.22,20.8
Data "A6",1760.00,19.6
Data "A#6/Bb6",1864.66,18.5
Data "B6",1975.53,17.5
Data "C7",2093.00,16.5
Data "C#7/Db7",2217.46,15.6
Data "D7",2349.32,14.7
Data "D#7/Eb7",2489.02,13.9
Data "E7",2637.02,13.1
Data "F7",2793.83,12.3
Data "F#7/Gb7",2959.96,11.7
Data "G7",3135.96,11.0
Data "G#7/Ab7",3322.44,10.4
Data "A7",3520.00,9.8
Data "A#7/Bb7",3729.31,9.3
Data "B7",3951.07,8.7
Data "C8",4186.01,8.2
Data "C#8/Db8",4434.92,7.8
Data "D8",4698.64,7.3
Data "D#8/Eb8",4978.03,6.9 |
Comments
| ||
| where can I get audio.bb ? |
| ||
| I found the missing stuff here: Audio Recording & extended CD Functions V2 |
| ||
| I added these two lines to make it a FUNCTIONING recording musical synthesizer: Place them after the line ";Saved as Stest'x'.wav in current directory" if snd<>0 then FreeSound snd snd=LoadSound("Stest"+(Capinc+1)+".wav") And record yourself saying "Max Headroom", next repeatedly hit a key (scroll your mousewheel up if it's too low in pitch!) |
Code Archives Forum