Функция Qb_PLAY - проигрыватель-интерпретатор музыки из символьных строк.

KoGG
KoGG аватар
Offline
Зарегистрирован: 17.11.2012

В сети я вижу дефицит мелодий для пьезопищалки платы Arduino.
По этому случаю я написал функцию Qb_PLAY - проигрыватель-интерпретатор музыки
из символьных строк стандарта АВС, аналогично оператору QBASIC PLAY.
http://www.cyberforum.ru/beta-testing/thread699658.html

Ниже архив с 173 мелодиями в файлах *.bas :

http://www.cyberforum.ru/cpp-beginners/thread694596.html#post3682700

dronsoft
Offline
Зарегистрирован: 02.06.2011

Вопрос а имитацию выстрела реально так осуществить?

KoGG
KoGG аватар
Offline
Зарегистрирован: 17.11.2012

Вот опыты со звуковыми эфектами на VB или VBA ,

на С++ можно сделать аналогичные, правда выстрел и белый шум не получаются:

Option Explicit
Private Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Public Sub Main()
    Dim tempLong&
    Dim i%, j%, Niz%, Verh%, Dlit&, Osnova%, Shag%
    Dim Razmah%, DlitZvukPauza%, ChisloZvukov%, Freq&  ' , DlitFraza%

    ' Речь ведроида
    For i = 1 To 5
        Osnova = Rnd()
        Osnova = 100 + Osnova * Osnova * 6000
        DlitZvukPauza = 50 + Rnd() * 100 ' ms
        ChisloZvukov = 3 + Rnd() * 10
        For j = 1 To ChisloZvukov
            Freq = Osnova * (1 + Rnd() * 0.1)
            Dlit = DlitZvukPauza * (0.5 + Rnd() * 0.5)
            Beep Freq, Dlit
            Dlit = DlitZvukPauza - Dlit
            Sleep Dlit
        Next
    Next

' Dim tempLong&
' Dim i%, j%, Niz%, Verh%, Dlit%, Osnova%, Shag%, Fraza%
'  Мотор 2
'    Dlit = 20
'    Osnova = 200
'    For i = 1 To 5
'        For j = -10 To 10
'            Beep Osnova + j, Dlit
'            Beep Osnova, Dlit
'        Next
'        For j = 10 To -10 Step -1
'            Beep Osnova + j, Dlit
'            Beep Osnova, Dlit
'        Next
'    Next

  ' Игровой звук
'    Dlit = 20
'    Verh = 600
'    Niz = 100
'    For i = 1 To 50
'        Osnova = Rnd() * (Verh - Niz) + Niz
'        Beep Osnova, Dlit
'    Next

'  Мотор 3
'    Dlit = 10
'    Osnova = 200
'    For i = 1 To 5
'        For j = 0 To 100 Step 5
'            Beep Osnova + j, Dlit
'        Next
'    Next

'    Dlit = 5
'    Osnova = 1000
'    For i = 1 To 5
'        For j = 0 To 100 Step 5
'            Beep Osnova + j, Dlit
'        Next
'    Next

' Цикада

'    Dlit = 5
'    Niz = 1000
'    Verh = 2000
'    For i = 1 To 5
'        For j = 0 To 100 Step 5
'            Beep Niz + j, Dlit
'            Beep Verh + j, Dlit
'        Next
'    Next

' Мотор 4
'    Dlit = 5
'    Niz = 100
'    Verh = 400
'    For i = 1 To 10
'        For j = 0 To 100 Step 5
'            Beep Niz + j, Dlit
'            Beep Verh + j, Dlit
'        Next
'    Next

' Мотор 5
'    Dlit = 5
'    Niz = 100
'    Osnova = 400
'    Verh = 1000
'    For i = 1 To 100
'        Beep Niz + j, Dlit
'        Beep Verh + j, Dlit
'        Beep Osnova + j, Dlit
'    Next

' Булькание
'    Dlit = 5
'    Niz = 100
'    Verh = 1000
'    Shag = 100
'    For i = 1 To 100
'        For j = Niz To Verh Step Shag
'            Beep j, Dlit
'        Next
'    Next

'Сирена
'    Dlit = 10
'    Niz = 1000
'    Verh = 3000
'    Shag = 100
'    For i = 1 To 20
'        For j = Niz To Verh Step Shag
'            Beep j, Dlit
'        Next
'        For j = Verh To Niz Step -Shag
'            Beep j, Dlit
'        Next
'    Next

' Звуковой счетчик
'    Dlit = 200
'    For i = 0 To 100
'       Osnova = 3000 - i * 28
'       Beep Osnova, Dlit
'       Sleep Dlit
'    Next

End Sub

 

 

KoGG
KoGG аватар
Offline
Зарегистрирован: 17.11.2012

Вот два примера на С++ для Ардуино:

  int i, j, Dlit, Freq;
  int Niz, Verh, Osnova, Shag; // переменные для работы со звуком
  int Razmah, DlitZvukPauza, ChisloZvukov; 
              // Речь ведроида
              for (i=1;i<11; i++)
              {
                  Osnova = 100 + random(3000);
                  DlitZvukPauza = 20;
                  ChisloZvukov = 3 + random(10);
                  for (j = 1; j<=ChisloZvukov; j++)
                  {
                      Freq = Osnova  + random(Osnova*0.3);
                      Dlit = DlitZvukPauza * 0.5 +random(DlitZvukPauza*0.5);
                      tone(SoundPin,Freq, Dlit);    
                      delay(Dlit);                     
                      Dlit = DlitZvukPauza - Dlit;
                      delay(Dlit);                     
                    }
              }         
            //Сирена
              Dlit = 17;
              Niz = 500;
              Verh = 2000;
              Shag = 70;
              for (i=1;i<11; i++)
                {
                  for (j = Niz;j<= Verh;j+=Shag)
                    {
                    tone(SoundPin,j, Dlit);    
                    delay(Dlit);                   
                    }
                  for (j = Verh;j>= Niz;j-=Shag)
                    {
                    tone(SoundPin,j, Dlit);    
                    delay(Dlit);                   
                    }
                }