1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
|
/* (c) 2002-2004 by Marcin Wiacek */
#ifndef __gsm_ring_h
#define __gsm_ring_h
/* --------------- Smart Messaging Specification 2.0 & 3.0 ----------------- */
#define SM_CommandEnd_CommandEnd 0x00
/* specification gives also other */
#define SM_Command_RingingToneProgramming 0x25<<1
#define SM_Command_Sound 0x1d<<1
/* specification gives also other */
#define SM_Song_BasicSongType 0x01<<5
/* specification gives also other */
#define SM_PatternID_A_part 0x00<<6
/* specification gives also other */
#define SM_InstructionID_PatternHeaderId 0x00<<5
#define SM_InstructionID_NoteInstructionId 0x01<<5
#define SM_InstructionID_ScaleInstructionId 0x02<<5
#define SM_InstructionID_StyleInstructionId 0x03<<5
#define SM_InstructionID_TempoInstructionId 0x04<<5
#define SM_InstructionID_VolumeInstructionId 0x05<<5
/* ------ end of Smart Messaging Specification 2.0 & 3.0 definitions ------- */
#define MAX_RINGTONE_NOTES 255
typedef enum {
/**
* Natural style (rest between notes)
*/
NaturalStyle = 0x00<<6,
/**
* Continuous style (no rest between notes)
*/
ContinuousStyle = 0x01<<6,
/**
* Staccato style (shorter notes and longer rest period)
*/
StaccatoStyle = 0x02<<6
} GSM_RingNoteStyle;
typedef enum {
Note_Pause = 0x00<<4,
Note_C = 0x01<<4,
Note_Cis = 0x02<<4,
Note_D = 0x03<<4,
Note_Dis = 0x04<<4,
Note_E = 0x05<<4,
Note_F = 0x06<<4,
Note_Fis = 0x07<<4,
Note_G = 0x08<<4,
Note_Gis = 0x09<<4,
Note_A = 0x0a<<4,
Note_Ais = 0x0b<<4,
Note_H = 0x0c<<4
} GSM_RingNoteNote;
typedef enum {
Duration_Full = 0x00<<5,
Duration_1_2 = 0x01<<5,
Duration_1_4 = 0x02<<5,
Duration_1_8 = 0x03<<5,
Duration_1_16 = 0x04<<5,
Duration_1_32 = 0x05<<5
} GSM_RingNoteDuration;
typedef enum {
NoSpecialDuration = 0x00<<6,
DottedNote = 0x01<<6,
DoubleDottedNote = 0x02<<6,
Length_2_3 = 0x03<<6
} GSM_RingNoteDurationSpec;
typedef enum {
Scale_55 = 1, /* 55 Hz for note A */
Scale_110, /* 110 Hz for note A */
Scale_220,
Scale_440, /* first scale for Nokia */
Scale_880,
Scale_1760,
Scale_3520, /* last scale for Nokia */
Scale_7040,
Scale_14080
} GSM_RingNoteScale;
typedef struct {
GSM_RingNoteDuration Duration;
GSM_RingNoteDurationSpec DurationSpec;
GSM_RingNoteNote Note;
GSM_RingNoteStyle Style;
GSM_RingNoteScale Scale;
int Tempo;
} GSM_RingNote;
typedef enum {
RING_Note = 1,
RING_EnableVibra,
RING_DisableVibra,
RING_EnableLight,
RING_DisableLight,
RING_EnableLED,
RING_DisableLED,
RING_Repeat
} GSM_RingCommandType;
typedef struct {
GSM_RingCommandType Type;
GSM_RingNote Note;
unsigned char Value;
} GSM_RingCommand;
typedef struct {
int NrCommands;
GSM_RingCommand Commands[MAX_RINGTONE_NOTES];
bool AllNotesScale;
} GSM_NoteRingtone;
/* FIXME: should use BinaryTone instead? */
/* Structure to hold Nokia binary ringtones. */
typedef struct {
unsigned char Frame[50000];
int Length;
} GSM_NokiaBinaryRingtone;
typedef struct {
unsigned char *Buffer;
int Length;
} GSM_BinaryTone;
typedef enum {
RING_NOTETONE = 1,
RING_NOKIABINARY,
RING_MIDI,
RING_MMF
} GSM_RingtoneFormat;
/**
* Structure for saving various ringtones formats
*/
typedef struct {
/**
* Ringtone saved in one of three formats
*/
GSM_NokiaBinaryRingtone NokiaBinary;
GSM_BinaryTone BinaryTone;
GSM_NoteRingtone NoteTone;
/**
* Ringtone format
*/
GSM_RingtoneFormat Format;
/**
* Ringtone name
*/
char Name[20*2];
/**
* Ringtone location
*/
int Location;
} GSM_Ringtone;
typedef struct {
int Group; //Nokia specific
int ID;
char Name[30*2];
} GSM_RingtoneInfo;
typedef struct {
int Number;
GSM_RingtoneInfo Ringtone[100];
} GSM_AllRingtonesInfo;
GSM_Error GSM_SaveRingtoneFile(char *FileName, GSM_Ringtone *ringtone);
GSM_Error GSM_ReadRingtoneFile(char *FileName, GSM_Ringtone *ringtone);
void saveott(FILE *file, GSM_Ringtone *ringtone);
void savemid(FILE *file, GSM_Ringtone *ringtone);
void saverng(FILE *file, GSM_Ringtone *ringtone);
void saveimelody(FILE *file, GSM_Ringtone *ringtone);
GSM_Error savewav(FILE *file, GSM_Ringtone *ringtone);
GSM_Error saverttl(FILE *file, GSM_Ringtone *ringtone);
unsigned char GSM_EncodeNokiaRTTLRingtone (GSM_Ringtone ringtone, unsigned char *package, int *maxlength);
unsigned char GSM_EncodeEMSSound (GSM_Ringtone ringtone, unsigned char *package, int *maxlength, double version, bool start);
GSM_Error GSM_DecodeNokiaRTTLRingtone (GSM_Ringtone *ringtone, unsigned char *package, int maxlength);
GSM_Error GSM_RingtoneConvert(GSM_Ringtone *dest, GSM_Ringtone *src, GSM_RingtoneFormat Format);
int GSM_RTTLGetTempo (int Beats);
int GSM_RingNoteGetFrequency (GSM_RingNote Note);
int GSM_RingNoteGetFullDuration (GSM_RingNote Note);
char *GSM_GetRingtoneName(GSM_AllRingtonesInfo *Info, int ID);
#endif
/* How should editor hadle tabs in this file? Add editor commands here.
* vim: noexpandtab sw=8 ts=8 sts=8:
*/
|