creating audio sample
BlitzMax Forums/BlitzMax Beginners Area/creating audio sample
| ||
I have some questions about next code: ' createaudiosample.bmx Local sample:TAudioSample=CreateAudioSample( 32,11025,SF_MONO8 ) For Local k=0 Until 32 sample.samples[k]=Sin(k*360/32)*127.5+127.5 Next Local sound:TSound=LoadSound( sample,True ) PlaySound(sound) Input 1. what is the mining of 32 in the first parameter of createaudiosample ? 2. what is the meaning of 11025 in the second parameter ? 3. what is the meaning of SF_MONO8 in the 3 parameter ? 4. what is the meaning of the values in sample.samples[] ? |
| ||
1. The number of 'samples' in the sound. 2. The playback frequency (samples per second) 3. The sound format (in this case 8-bit monosound) 4. The values in the audio sample's sample array (this example has it so when played, it prodyces a sine wave sound). Samples in an audio sample are merely numbers. The sample array is basically an array of bytes. In 8-bit monosound, values only range 0-255 for each sample in the sound. An 'audio sample' is a sound that has 'bit samples.' |
| ||
is it true to say that CreateAudioSample is aim to create midi song of music instrument so we get that: the first parameter represents the number of notes we play. the second parameter represents how speed we play the song and the third parameter represents the quality of the instrument playing the song ? if so I understand that sample.samples[] actually hold the notes of the song ? and if what I say is true then how can I set the music instrument (piano\guitar\harmonica...) ? |
| ||
No, an Audio Sample is considered one sound. You can load the sound using LoadAudioSample("examplesound.wav") where .wav could also be .ogg or another supported audio format. The array of samples inside of an audio sample are the actual data of the sound stored in memory. They don't represent notes like a MIDI file. The audio sample's "sample array" is meant to be played at the frequency mentioned above (in this example 11025 Hz). This is very fast. If you load a sound that lasts for 1 second and is played back at this frequency, then that means the sound has 11025 samples. I don't know if BlitzMax has support for .midi files, but you're on the right track. You can use Audio Samples to create the instruments you want to play in a sequence, but you'll need to find a module for it, or make it yourself. |
| ||
If you want to create MIDI songs, CreateAudioSample() is the wrong function for you. For MIDI you have two possibilities: 1. Use and play a complete MIDI-Song "sample.mid". 2. Fire MIDI Events to the MIDI Device. Then you use Bruceys module "BAH.MOD/RTMIDI.MOD" Here is a small sample about using MIDI: SuperStrict Import BaH.RtMidi Graphics 300,200 ' Midi-Out-Check und Start Global midiOut:TRtMidiOut = New TRtMidiOut.Create() Global message:Byte[] = New Byte[3] If midiOut.getPortCount() = 0 Then Print "No Input Ports" End End If For Local i:Int = 0 Until midiOut.getPortCount() Print " Input port #" + i + " : " + midiOut.getPortName(i) Next Print "Opening " + midiOut.getPortName() midiOut.openPort(0) StartTon=36 ' von c EndTon = 72 ' bis c'' Kanal=1 ' Töne=1 , Drums=9 Laut=90 ' Midi Volume Lang=2000 ' Tonlänge: 500msec ~ ca 1/4 Note bei Tempo 120 Instrument=0 ' GM Instrument-Nr SampleName="Piano" Global Zeit%=MilliSecs()+500 Delay 200 ProgrammChange() Ton=StartTon Repeat If Zeit<MilliSecs() Select Mode Case 0 'play SpielTon Ton, Laut, Kanal Zeit=Zeit + Lang Mode=1 Case 1 'stop SpielTon Ton, 0, Kanal Zeit=Zeit+ Warte Mode=2 Case 2 HoleAlleSamplesAb Zeit=Zeit+ Warte Ton=Ton +1 Mode=0 End Select EndIf DrawText "press esc to exit",100,100 Flip 0 Delay 15 If Ton>=EndTon Then Exit Until KeyHit(Key_Escape) SpielTon Ton, 0, Kanal midiout.Free End Function SpielTon (Ton%, Laut% , Kanal%) message[0] = 144 + Kanal message[1] = Ton message[2] = Laut midiout.putMessage(message, 3) End Function Function ProgrammChange() message[0] = 192+Kanal message[1] = Instrument message[2] = 0 midiout.putMessage(message, 2) End Function |
| ||
can I mathematically map a given note on a given instrument to a data value in sample.samples[] ? |
| ||
No. The samples[] array is used to create sound waves. If samples[0] is 255 and samples[1] is 0, the difference between the two samples will generate a sound. Similarly, square waves are designed using this similar manner. If 64 samples are allocated, with 0-31 being 0 and 32-63 being 255, this creates a clean, retro-sounding note when played back at a high frequency. In contrast, if you happen to assign all sampels the same value, no sound will be played. This is because there is no difference in the samples, and cannot generate a sound of any sort. Sounds are generated by vibrations, and the samples array in an audio sample is used to emulate that. EDIT: ![]() This is a visual example of the sound used in the tutorial example. |