FireBirdLib - Topfield TMS PVR TAP Programming Library
SoundSinus.c
Go to the documentation of this file.
1#include <stdlib.h>
2#include "libFireBird.h"
3
4short *soundData = NULL;
6
7void SoundSinus(word freq, dword durationInMilliseconds, word Amplitude)
8{
10
11 dword samples, memSize, periode, index;
12 short *target, *source;
13
14 short Sinus[360] = {0x0000, 0x023C, 0x0478, 0x06B3, 0x08EE, 0x0B28, 0x0D61, 0x0F99, 0x11D0, 0x1406, 0x163A, 0x186C, 0x1A9D, 0x1CCB, 0x1EF7, 0x2121,
15 0x2348, 0x256C, 0x278E, 0x29AC, 0x2BC7, 0x2DDF, 0x2FF3, 0x3203, 0x3410, 0x3618, 0x381C, 0x3A1C, 0x3C17, 0x3E0E, 0x4000, 0x41EC,
16 0x43D4, 0x45B6, 0x4793, 0x496A, 0x4B3C, 0x4D08, 0x4ECD, 0x508D, 0x5246, 0x53F9, 0x55A5, 0x574B, 0x58EA, 0x5A82, 0x5C13, 0x5D9C,
17 0x5F1F, 0x609A, 0x620D, 0x6379, 0x64DD, 0x6639, 0x678D, 0x68D9, 0x6A1D, 0x6B59, 0x6C8C, 0x6DB7, 0x6ED9, 0x6FF3, 0x7104, 0x720C,
18 0x730B, 0x7401, 0x74EE, 0x75D2, 0x76AD, 0x777F, 0x7847, 0x7906, 0x79BB, 0x7A67, 0x7B0A, 0x7BA2, 0x7C32, 0x7CB7, 0x7D33, 0x7DA5,
19 0x7E0D, 0x7E6C, 0x7EC0, 0x7F0B, 0x7F4B, 0x7F82, 0x7FAF, 0x7FD2, 0x7FEB, 0x7FFA, 0x7FFF, 0x7FFA, 0x7FEB, 0x7FD2, 0x7FAF, 0x7F82,
20 0x7F4B, 0x7F0B, 0x7EC0, 0x7E6C, 0x7E0D, 0x7DA5, 0x7D33, 0x7CB7, 0x7C32, 0x7BA2, 0x7B0A, 0x7A67, 0x79BB, 0x7906, 0x7847, 0x777F,
21 0x76AD, 0x75D2, 0x74EE, 0x7401, 0x730B, 0x720C, 0x7104, 0x6FF3, 0x6ED9, 0x6DB7, 0x6C8C, 0x6B59, 0x6A1D, 0x68D9, 0x678D, 0x6639,
22 0x64DD, 0x6379, 0x620D, 0x609A, 0x5F1F, 0x5D9C, 0x5C13, 0x5A82, 0x58EA, 0x574B, 0x55A5, 0x53F9, 0x5246, 0x508D, 0x4ECD, 0x4D08,
23 0x4B3C, 0x496A, 0x4793, 0x45B6, 0x43D4, 0x41EC, 0x3FFF, 0x3E0E, 0x3C17, 0x3A1C, 0x381C, 0x3618, 0x3410, 0x3203, 0x2FF3, 0x2DDF,
24 0x2BC7, 0x29AC, 0x278E, 0x256C, 0x2348, 0x2121, 0x1EF7, 0x1CCB, 0x1A9D, 0x186C, 0x163A, 0x1406, 0x11D0, 0x0F99, 0x0D61, 0x0B28,
25 0x08EE, 0x06B3, 0x0478, 0x023C, 0x0000, 0xFDC4, 0xFB88, 0xF94D, 0xF712, 0xF4D8, 0xF29F, 0xF067, 0xEE30, 0xEBFA, 0xE9C6, 0xE794,
26 0xE563, 0xE335, 0xE109, 0xDEDF, 0xDCB8, 0xDA94, 0xD872, 0xD654, 0xD439, 0xD221, 0xD00D, 0xCDFD, 0xCBF0, 0xC9E8, 0xC7E4, 0xC5E4,
27 0xC3E9, 0xC1F2, 0xC000, 0xBE14, 0xBC2C, 0xBA4A, 0xB86D, 0xB696, 0xB4C4, 0xB2F8, 0xB133, 0xAF73, 0xADBA, 0xAC07, 0xAA5B, 0xA8B5,
28 0xA716, 0xA57E, 0xA3ED, 0xA264, 0xA0E1, 0x9F66, 0x9DF3, 0x9C87, 0x9B23, 0x99C7, 0x9873, 0x9727, 0x95E3, 0x94A7, 0x9374, 0x9249,
29 0x9127, 0x900D, 0x8EFC, 0x8DF4, 0x8CF5, 0x8BFF, 0x8B12, 0x8A2E, 0x8953, 0x8881, 0x87B9, 0x86FA, 0x8645, 0x8599, 0x84F6, 0x845E,
30 0x83CE, 0x8349, 0x82CD, 0x825B, 0x81F3, 0x8194, 0x8140, 0x80F5, 0x80B5, 0x807E, 0x8051, 0x802E, 0x8015, 0x8006, 0x8001, 0x8006,
31 0x8015, 0x802E, 0x8051, 0x807E, 0x80B5, 0x80F5, 0x8140, 0x8194, 0x81F3, 0x825B, 0x82CD, 0x8349, 0x83CE, 0x845E, 0x84F6, 0x8599,
32 0x8645, 0x86FA, 0x87B9, 0x8881, 0x8953, 0x8A2E, 0x8B12, 0x8BFF, 0x8CF5, 0x8DF4, 0x8EFC, 0x900D, 0x9127, 0x9249, 0x9374, 0x94A7,
33 0x95E3, 0x9727, 0x9873, 0x99C7, 0x9B23, 0x9C87, 0x9DF3, 0x9F66, 0xA0E1, 0xA264, 0xA3ED, 0xA57E, 0xA716, 0xA8B5, 0xAA5B, 0xAC07,
34 0xADBA, 0xAF73, 0xB133, 0xB2F8, 0xB4C4, 0xB696, 0xB86D, 0xBA4A, 0xBC2C, 0xBE14, 0xC001, 0xC1F2, 0xC3E9, 0xC5E4, 0xC7E4, 0xC9E8,
35 0xCBF0, 0xCDFD, 0xD00D, 0xD221, 0xD439, 0xD654, 0xD872, 0xDA94, 0xDCB8, 0xDEDF, 0xE109, 0xE335, 0xE563, 0xE794, 0xE9C6, 0xEBFA,
36 0xEE30, 0xF067, 0xF29F, 0xF4D8, 0xF712, 0xF94D, 0xFB88, 0xFDC4};
37
38 (void) Amplitude;
39
40 samples = durationInMilliseconds * 48;
41 memSize = samples * 2; //Zwei Byte pro Sample (16 bit)
42
43 if((soundData != NULL) && (soundDataLength < memSize))
44 {
45 TAP_MemFree(soundData); //Gebe den beim letzten Ton belegten Speicher wieder frei
46 soundData = NULL;
47 }
48
49 if(soundData == NULL)
50 {
51 soundData = (word*) TAP_MemAlloc(memSize);
52 soundDataLength = memSize;
53 }
54
55 if(soundData == NULL)
56 {
57 TRACEEXIT();
58 return;
59 }
60 target = soundData;
61 periode = 48000 / freq; //Anzahl von Samples für eine volle Schwingung
62 if(periode > samples)
63 {
64 //Die Dauer ist zu kurz, um auch nur eine einzelne vollständige Welle abzubilden
65 TRACEEXIT();
66 return;
67 }
68
69 //Berechne die erste vollständige Welle
70 for(index = 0; index < periode; index++)
71 {
72 (*target) = Sinus[(index * 360) / periode];
73 target++;
74 }
75
76 //Alle weiteren Wellen können einfach kopiert werden
77 source = soundData;
78 for(index = periode; index < samples - periode; index++)
79 {
80 (*target) = (*source);
81 target++;
82 source++;
83 }
84
85 //Erzeuge ein Fade in
86 for(index = 0; index < 480; index ++)
87 {
88 soundData[index] = soundData[index] / 480 * index;
89 }
90
91 //Erzeuge ein Fade out
92 for(index = 0; index < 1680; index ++)
93 {
94 soundData[samples - index] = soundData[samples - index] / 1680 * index;
95 }
96
97 TAP_PlayPCM((void *) soundData, 2 * samples, FREQ_48K, NULL);
98
99 TRACEEXIT();
100}
dword soundDataLength
Definition: SoundSinus.c:5
void SoundSinus(word freq, dword durationInMilliseconds, word Amplitude)
Definition: SoundSinus.c:7
short * soundData
Definition: SoundSinus.c:4
#define TRACEEXIT()
Definition: libFireBird.h:1244
#define TRACEENTER()
Definition: libFireBird.h:1243