Sound Library

The mikroPascal PRO for ARM provides a Sound Library to supply users with routines necessary for sound signalization in their applications. Sound generation needs additional hardware, such as piezo-speaker (example of piezo-speaker interface is given on the schematic at the bottom of this page).

Library Routines

Sound_Init

Prototype

procedure Sound_Init(var snd_port, snd_pin: dword);

Description

Configures the appropriate MCU pin for sound generation.

Parameters
  • snd_port: sound output port address
  • snd_pin: sound output pin
Returns

Nothing.

Requires

Nothing.

Example

Stellaris

// Initialize the pin GPIO_PORTA.6 for playing sound
Sound_Init(GPIO_PORTA_DATA, 6);

STM32

// Initialize the pin GPIOE_ODR.14 for playing sound
Sound_Init(GPIOE_ODR, 14);
    
Notes

None.

Sound_Play

Prototype

procedure Sound_Play(freq_in_hz, duration_ms: word);

Description

Generates the square wave signal on the appropriate pin.

Parameters
  • freq_in_hz: signal frequency in Hertz (Hz)
  • duration_ms: signal duration in miliseconds (ms)
Returns

Nothing.

Requires

In order to hear the sound, you need a piezo speaker (or other hardware) on designated port. Also, you must call Sound_Init to prepare hardware for output before using this function.

Example
// Play sound of 1KHz in duration of 100ms
Sound_Play(1000, 100);
Notes

None.

Library Example

The example is a simple demonstration of how to use the Sound Library for playing tones on a piezo speaker.

Stellaris

program Sound;

procedure Tone1();
  begin
    Sound_Play(659, 250);            // Frequency = 659Hz, duration = 250ms
  end;

procedure Tone2();
  begin
    Sound_Play(698, 250);            // Frequency = 698Hz, duration = 250ms
  end;

procedure Tone3();
  begin
    Sound_Play(784, 250);            // Frequency = 784Hz, duration = 250ms
  end;

procedure Melody();                  // Plays the melody "Yellow house"
  begin
    Tone1(); Tone2(); Tone3(); Tone3();
    Tone1(); Tone2(); Tone3(); Tone3();
    Tone1(); Tone2(); Tone3();
    Tone1(); Tone2(); Tone3(); Tone3();
    Tone1(); Tone2(); Tone3();
    Tone3(); Tone3(); Tone2(); Tone2(); Tone1();
  end;

procedure ToneA();                   // Tones used in Melody2 function
  begin
    Sound_Play( 880, 50);
  end;

procedure ToneC();
  begin
    Sound_Play(1046, 50);
  end;

procedure ToneE();
  begin
    Sound_Play(1318, 50);
  end;

procedure Melody2();                 // Plays Melody2
var counter : byte;
  begin
    for counter := 9 downto 1 do
      begin
        ToneA();
        ToneC();
        ToneE();
      end;
  end;

begin

  GPIO_Config(@GPIO_PORTJ_DATA, %11111000, _GPIO_DIR_INPUT, _GPIO_CFG_DIGITAL_ENABLE, 0);
  Sound_Init(GPIO_PORTA_DATA, 6);
  Sound_Play(880, 1000);

  while TRUE do                          // endless loop
    begin
      if (Button(GPIO_PORTJ_DATA,7,1,1)) then      // If GPIO_PORTJ.7 is pressed play Tone1
        begin
          Tone1();
          while (GPIO_PORTJ_DATA7_bit <> 0) do nop;   // Wait for button to be released
        end;

      if (Button(GPIO_PORTJ_DATA,6,1,1)) then      // If GPIO_PORTJ.6 is pressed play Tone1
        begin
          Tone2();
          while (GPIO_PORTJ_DATA6_bit <> 0) do nop;   // Wait for button to be released
        end;

      if (Button(GPIO_PORTJ_DATA,5,1,1)) then      // If GPIO_PORTJ.5 is pressed play Tone1
        begin
          Tone3();
          while (GPIO_PORTJ_DATA5_bit <> 0) do nop;   // Wait for button to be released
        end;

      if (Button(GPIO_PORTJ_DATA,4,1,1)) then      // If GPIO_PORTJ.4 is pressed play Tone1
        begin
          Melody2();
          while (GPIO_PORTJ_DATA4_bit <> 0) do nop;   // Wait for button to be released
        end;

      if (Button(GPIO_PORTJ_DATA,3,1,1)) then      // If GPIO_PORTJ.3 is pressed play Tone1
          begin
            Melody();
            while (GPIO_PORTJ_DATA3_bit <> 0) do nop; // Wait for button to be released
          end;
    end;
end.

STM32

program Sound;

procedure Tone1();
  begin
    Sound_Play(659, 250);            // Frequency = 659Hz, duration = 250ms
  end;

procedure Tone2();
  begin
    Sound_Play(698, 250);            // Frequency = 698Hz, duration = 250ms
  end;

procedure Tone3();
  begin
    Sound_Play(784, 250);            // Frequency = 784Hz, duration = 250ms
  end;

procedure Melody();                  // Plays the melody "Yellow house"
  begin
    Tone1(); Tone2(); Tone3(); Tone3();
    Tone1(); Tone2(); Tone3(); Tone3();
    Tone1(); Tone2(); Tone3();
    Tone1(); Tone2(); Tone3(); Tone3();
    Tone1(); Tone2(); Tone3();
    Tone3(); Tone3(); Tone2(); Tone2(); Tone1();
  end;

procedure ToneA();                   // Tones used in Melody2 function
  begin
    Sound_Play( 880, 50);
  end;

procedure ToneC();
  begin
    Sound_Play(1046, 50);
  end;

procedure ToneE();
  begin
    Sound_Play(1318, 50);
  end;

procedure Melody2();                 // Plays Melody2
var counter : byte;
  begin
    for counter := 9 downto 1 do
      begin
        ToneA();
        ToneC();
        ToneE();
      end;
  end;

begin

  GPIO_Digital_Input(@GPIOD_IDR, _GPIO_PINMASK_LOW);
  Sound_Init(GPIOE_ODR, 14);
  Sound_Play(880, 1000);

  while TRUE do                          // endless loop
    begin
      if (Button(GPIOD_IDR,7,1,1)) then      // If PORTB.7 is pressed play Tone1
        begin
          Tone1();
          while (GPIOD_IDR.B7 <> 0) do nop;   // Wait for button to be released
        end;

      if (Button(GPIOD_IDR,6,1,1)) then      // If PORTB.6 is pressed play Tone1
        begin
          Tone2();
          while (GPIOD_IDR.B6 <> 0) do nop;   // Wait for button to be released
        end;

      if (Button(GPIOD_IDR,5,1,1)) then      // If PORTB.5 is pressed play Tone1
        begin
          Tone3();
          while (GPIOD_IDR.B5) do nop;   // Wait for button to be released
        end;

      if (Button(GPIOD_IDR,4,1,1)) then      // If PORTB.4 is pressed play Tone1
        begin
          Melody2();
          while (GPIOD_IDR.B4 <> 0) do nop;   // Wait for button to be released
        end;

      if (Button(GPIOD_IDR,3,1,1)) then      // If PORTB.3 is pressed play Tone1
          begin
            Melody();
            while (GPIOD_IDR.B3 <> 0) do nop; // Wait for button to be released
          end;
    end;
end.
Copyright (c) 2002-2012 mikroElektronika. All rights reserved.
What do you think about this topic ? Send us feedback!
Want more examples and libraries? 
Find them on LibStock - A place for the code