Siniaaltoa CB:llä! (nothing new here! ;O)

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
User avatar
Misthema
Advanced Member
Posts: 312
Joined: Mon Aug 27, 2007 8:32 pm
Location: Turku, Finland
Contact:

Siniaaltoa CB:llä! (nothing new here! ;O)

Post by Misthema »

Jou.

Olen tässä kikkaillut ja testaillut Valtzu:n tekemää äänifunktiota ja lisäilin siihen parit jutut vielä, joista on hyötyä niille, jotka ovat halukkaita tekemään jonninsortin musasoftan! ;)
Jos jollain on jotain kivaa lisättävää tähän, lähettäkää toki uusi koodinpätkä viestinne mukana. :roll:

Koodia pukkaa, koodia pukkaa:

Code: Select all

// ---    Äänifunktioita by Valtzu (2007)    --- //
// --- Taajuudet + nuotit by misthema (2010) --- //


/////////////////
//            //
//  Esimerkki  //
//            //
/////////////////

For i=0 To 84
    sndTMP = SinWave(GetFreq(i),1,90)
    Print "note: "+GetNote(i+12)+", freq: "+GetFreq(i)
    PlaySound sndTMP  // Soitetaan ääni
    Wait 250
    DeleteSound sndTMP // Ääni pois muistista
Next i

WaitKey



// --- Funktiot --- //

// Ääni tietyltä taajuudelta
Function SinWave(taajuus#, pituus#, voimakkuus#=100)
    fq=44100
    length=pituus*fq
    f=OpenToWrite("tmpwav.tmp")
    WriteInt f,$52494646
    WriteInt f,0
    WriteInt f,$57415645
    WriteInt f,$666d7420
    WriteInt f,16
    WriteShort f,1
    WriteShort f,1
    WriteInt f,fq
    WriteInt f,fq*2
    WriteShort f,2
    WriteShort f,16
    WriteInt f,$64617461
    WriteInt f,length*2
    vokke = voimakkuus/100*32767
    For i = 0 To length-1
        WriteShort f,Sin(360.0*taajuus/fq*(i Mod fq))*vokke
    Next i
    fs=FileOffset(f)-8
    SeekFile f,4
    WriteInt f,fs
    CloseFile f
    tmpsnd=LoadSound("tmpwav.tmp")
    'DeleteFile "tmpwav.tmp"
    Return tmpsnd
End Function

// Turha 'raise-to-power' funktio
Function pow(a#,b#)
    Return a^b
EndFunction

// Haetaan nuotti
Function GetNote(note)
	Select note
		Case 254
			Return ""
		Case 255
			Return "---"
		Default
			Return Trim(Mid("C-C#D-D#E-F-F#G-G#A-A#B-",(note Mod 12)*2+1,2))+""+(note/12)
	EndSelect
EndFunction

Function GetFreq(note)
    Return 32.703 * pow(2.0, note/12.0)
EndFunction
EDIT:

Pientä päivitystä.

Wingman
Devoted Member
Posts: 594
Joined: Tue Sep 30, 2008 4:30 pm
Location: Ruudun toisella puolella

Re: Siniaaltoa CB:llä! (nothing new here! ;O)

Post by Wingman »

Misthema wrote:Jou.

Olen tässä kikkaillut ja testaillut Valtzu:n tekemää äänifunktiota ja lisäilin siihen parit jutut vielä, joista on hyötyä niille, jotka ovat halukkaita tekemään jonninsortin musasoftan! ;)
Jos jollain on jotain kivaa lisättävää tähän, lähettäkää toki uusi koodinpätkä viestinne mukana. :roll:

Koodia pukkaa, koodia pukkaa:

Code: Select all

// ---    Äänifunktioita by Valtzu (2007)    --- //
// --- Taajuudet + nuotit by misthema (2010) --- //


/////////////////
//            //
//  Esimerkki  //
//            //
/////////////////

For i=0 To 84
    sndTMP = SinWave(GetFreq(i),1,90)
    Print "note: "+GetNote(i+12)+", freq: "+GetFreq(i)
    PlaySound sndTMP  // Soitetaan ääni
    Wait 250
    DeleteSound sndTMP // Ääni pois muistista
Next i

WaitKey



// --- Funktiot --- //

// Ääni tietyltä taajuudelta
Function SinWave(taajuus#, pituus#, voimakkuus#=100)
    fq=44100
    length=pituus*fq
    f=OpenToWrite("tmpwav.tmp")
    WriteInt f,$52494646
    WriteInt f,0
    WriteInt f,$57415645
    WriteInt f,$666d7420
    WriteInt f,16
    WriteShort f,1
    WriteShort f,1
    WriteInt f,fq
    WriteInt f,fq*2
    WriteShort f,2
    WriteShort f,16
    WriteInt f,$64617461
    WriteInt f,length*2
    vokke = voimakkuus/100*32767
    For i = 0 To length-1
        WriteShort f,Sin(360.0*taajuus/fq*(i Mod fq))*vokke
    Next i
    fs=FileOffset(f)-8
    SeekFile f,4
    WriteInt f,fs
    CloseFile f
    tmpsnd=LoadSound("tmpwav.tmp")
    'DeleteFile "tmpwav.tmp"
    Return tmpsnd
End Function

// Turha 'raise-to-power' funktio
Function pow(a#,b#)
    Return a^b
EndFunction

// Haetaan nuotti
Function GetNote(note)
	Select note
		Case 254
			Return ""
		Case 255
			Return "---"
		Default
			Return Trim(Mid("C-C#D-D#E-F-F#G-G#A-A#B-",(note Mod 12)*2+1,2))+""+(note/12)
	EndSelect
EndFunction

Function GetFreq(note)
    Return 32.703 * pow(2.0, note/12.0)
EndFunction
EDIT:

Pientä päivitystä.

jeah, näitä taajuuksia olen joskus etsinyt! Ja hieno koodinpätkä tuo on
- - - -
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Siniaaltoa CB:llä! (nothing new here! ;O)

Post by MaGetzUb »

Miten sitten Saha-aalto toimii? Entäs Kantti? :D
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
User avatar
Misthema
Advanced Member
Posts: 312
Joined: Mon Aug 27, 2007 8:32 pm
Location: Turku, Finland
Contact:

Re: Siniaaltoa CB:llä! (nothing new here! ;O)

Post by Misthema »

MaGetzUb wrote:Miten sitten Saha-aalto toimii? Entäs Kantti? :D
Saha-aalto menisi yksinkertaisesti näin:

Code: Select all

position = 0
sample_length = 100
amp = 1
while position < sample_length
    sample( position ) = amp

    if amp < 255 and dir = up then
        amp = amp + 1
    elseif amp > 0 and dir = down then
        amp = amp - 1
    endif

    position = position + 1
wend
Kanttiaalto taas:

Code: Select all

sample_length = 100
for i = 0 to sample_length

    f = sin( i * 360 / 32 ) * 127.5 + 127.5

    If f>128 then  // skaala on taas 0-255
        sample( i ) = 255
    else
        sample( i ) = 0
    endIf
next


Jotenkin noin se menee =D Tottakai wikipediasta löytyy paremmat funktioyhtälölaskutoimitukset jne. Tässä yritin vain päästä heittää jotain... x)
Post Reply