annotate doc/Melody_E1 @ 465:003e48f8ebe1

rvinterf/etmsync/fsnew.c: cast 0 to (char *) for execl sentinel I generally don't use NULL and use plain 0 instead, based on a "NULL considered harmful" discussion on the classiccmp mailing list many aeons ago (I couldn't find it, and I reason that it must have been 2005 or earlier), but a recent complaint by a packager sent me searching, and I found this: https://ewontfix.com/11/ While I don't give a @#$% about "modern" systems and code-nazi tools, I realized that passing a plain 0 as a pointer sentinel in execl is wrong because it will break on systems where pointers are longer than the plain int type. Again, I don't give a @#$% about the abomination of x86_64 and the like, but if anyone ever manages to port my code to something like a PDP-11 (16-bit int, 32-bit long and pointers), then passing a plain 0 as a function argument where a pointer is expected most definitely won't work: if the most natural stack slot and SP alignment unit is 16 bits, fitting an int, with longs and pointers taking up two such slots, then the call stack will be totally wrong with a plain 0 passed for a pointer. Casting the 0 to (char *) ought to be the most kosher solution for the most retro systems possible.
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 11 Feb 2019 00:00:19 +0000
parents e50c3aa1152a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
180
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 Generating ringtone melodies through the Calypso DSP
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 ====================================================
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 The DSP in the Calypso and other GSM DBB chips from TI includes a built-in
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 capability for generating ringtone melodies to be played through a loudspeaker
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 driven by the ABB, without using an external melody generator chip. More
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 specifically, the DSP in question supports two flavors of internal melody
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 generation, called Melody E1 and Melody E2 - although it is unclear whether
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 Melody E2 is implemented in the DSP ROM or in the DSP code patches downloaded
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 by TI's firmwares.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 The Melody E1 mechanism produces simple polyphonic melodies with up to 8
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 simultaneous notes; these melodies consist of simple sine waves generated by
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 the DSP as commanded by the bits read from the melody file as explained below.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 Melody E2 is a more complex mechanism for producing melodies (also polyphonic
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 with up to 8 simultaneous notes) using the sounds of specific instruments,
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 rather than simple sine waves, but we currently lack the bits required in order
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 to understand or exercise it, hence our current focus is on the simpler Melody
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 E1 mechanism.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 How these melodies are played
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 =============================
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 TI's RiViera Audio Service firmware component provides a front-end to the
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 various audio services provided by the lower-level DSP+L1 combo. In the case
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 of Melody E1 and Melody E2 features, the combination of the DSP and TI's
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 ARM-side L1 code effectively defines the format of the melody bits themselves,
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 but the RiViera Audio Service takes care of reading these bits from FFS and
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 feeding them to L1.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 To play an E1 format melody, the UI code needs to call audio_melody_E1_start();
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 one of the arguments to this API function is the FFS absolute pathname of the
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 melody file. The API function will open this file and pass the open file
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 descriptor along with other parameters in the message posted to the Audio task;
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 the latter task will prefetch the first buffer-full of melody bits from the file
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 and then post an MMI_MELODY0_START_REQ message to the L1A task. The Melody E1
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 handler in L1A will set up some preliminaries and fire up the Melody E1 L1S
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 task, and the latter will then pass the melody bits to the DSP at appropriate
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 times.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 Melody E1 file format
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 =====================
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 We have found a rather terse and not particularly thorough description of the
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 Melody E1 bit format on pages 160 through 163 of this PDF document:
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 https://www.freecalypso.org/LoCosto-docs/PSL1DOC/L1/L1M_AS001_1.pdf
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 This description is not complete enough to enable proper understanding or
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 implementation, but by combining it with a study of the L1A and L1S code that
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 reads these bits and passes most of them to the DSP, we have reconstructed a
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 somewhat more complete picture.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 The format is word-oriented, i.e., the basic unit of data in a Melody E1 file
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 is the 16-bit word. Most of these words are passed to the DSP for final
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 interpretation inside the latter, hence we won't be able to have a 100% certain
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 understanding of what happens there unless we can find the source for the DSP
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 ROM code or expend a Herculean effort to reverse-engineer it, but some of the
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 words are interpreted and acted upon by the ARM-side L1 firmware code, which we
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 have source-reconstructed already. When these words are written in a disk or
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 FFS file, the byte order is little-endian, as it is ARM code that reads these
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 16-bit words from a byte-oriented source.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 The very first word in a Melody E1 file gives the global list of oscillators
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 used by this melody; this word is read by the L1A code before the L1S task is
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 fired up. The presence of this word is not documented at all in the terse
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 description given in L1M_AS001_1.pdf, and our attempts at producing our own E1
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 melodies were going nowhere until we discovered that this word is needed through
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 the study of our reconstructed TCS211 L1 code. This initial word corresponds
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 to the osc-set line in our ASCII format.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 After the initial word giving the global oscillator set, the melody file
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 consists of what we shall call time blocks. Each time block begins with a time
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 descriptor word which is interpreted and acted upon by ARM L1S code, followed
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 by 0 to 8 oscillator descriptors which are loaded into DSP API words. These
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 words are described in TI's document, so we are just going to supplement that
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 description wherever we have discovered something to the contrary.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 The lower byte of the time descriptor word tells the L1S task how long it should
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 wait before loading the following oscillator descriptors into the DSP. It
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 appears that TI's intent was for this time value to be measured in 20 ms audio
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 frames, but what the ARM L1S code actually does is multiply the given time value
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 by 4 and use the result as the number of TDMA frames to count - the L1S code
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 executes on every TDMA frame. 13 TDMA frames equal 60 ms, thus 4 TDMA frames
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 do not exactly equal 20 ms, but come a little short. It is not clear whether
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 the melody files generated by TI and/or their customers account for this
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 discrepancy or not. In any case, the time value given in the file needs to be
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 non-zero - putting a zero in there will cause the L1S counter to be set to 65535
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 TDMA frames (a 16-bit unsigned counter loaded with 0 and decremented by one),
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 which is probably not what you want.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 The upper byte of the time descriptor word is a bit mask indicating which DSP
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 oscillators are to be loaded at this time. This bit mask byte can be zero, in
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 which case the time block consists of just the time descriptor word. However,
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 the L1S code does absolutely nothing to the DSP in this case, hence an empty
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 (no oscillators) time block is indistinguishable from adding the time to the
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97 following non-empty block. But the largest time value that can fit in the byte
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 is 255, hence empty time blocks can be used to produce larger time deltas.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 A time descriptor with zeros in both upper and lower bytes indicates the end of
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 the melody; this terminator is required.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 Now we come to the interesting part: the oscillator descriptors that are loaded
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 into the DSP to cause the actual melody generation to occur. The DSP's NDB API
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 page contains 4 words for each of the 8 oscillators, and these NDB API words are
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 where the oscillator descriptor words from the melody file ultimately go.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 Please refer to the description of the ml_load1 and ml_load2 bits on page 162
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 of TI's L1M_AS001_1.pdf document. Now here is what the L1S code actually does:
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 first it loads 2 words from the file buffer into the DSP's NDB page - yes,
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 directly into there. Then it does the following logic (code simplified from
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 the actual into more readable pseudocode):
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 load_size = 0;
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 if (word1 & ml_load1)
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 load_size++;
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 if (word1 & ml_load2)
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 load_size++;
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 if (load_size)
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 load load_size words at word2 address in the DSP's NDB page
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 This logic is peculiar: what happens if ml_load2 is set but not ml_load1? The
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 result will be that the word meant to be word3 (the envelope word) will get
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123 loaded into the word2 location in the DSP's NDB page. Unless the DSP actually
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124 checks the ml_load bits and expects the envelope word in the word2 location in
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125 this case, which I highly doubt, this L1S behaviour looks like a bug to me - so
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 don't use the word3 present but not word2 combination in your melodies.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128 It appears that these ml_load1 and ml_load2 bits are only checked by the L1S
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129 code and ignored by the DSP. I say so because when I tried creating a melody
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130 in which word2 and word3 were always omitted, the result was bogus. It appears
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131 that the first time a given oscillator is loaded, all 4 words must always be
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 given, otherwise the DSP will act on whatever garbage happens to be in those
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133 NDB API words from before. When the same oscillator is subsequently reloaded,
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134 omitting word2 and/or word3 will cause that word's previous value to be reused.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136 A few notes regarding some bits in word0:
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138 ml_synchro (bit 0): the L1S code ORs a 1 into this bit in the NDB API word
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139 after it has loaded all of the words. It thus seems more correct to me to put
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140 a 0 in this bit in the files, so that the DSP sees the new descriptor when it
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141 is complete - but of course we can never know for sure without knowing what
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 actually happens inside the DSP.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144 ml_directF: both common sense and the TSM30 source (which uses the Melody E1
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
145 feature of the DSP in that old Calypso version) suggest that ml_directF is
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146 bit 1, ml_square1 is bit 2 and ml_square2 is bit 3, i.e., it appears that the
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147 table on page 161 of L1M_AS001_1.pdf is wrong in this regard. Also note the
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148 order in which the fields are described on page 162 of the same PDF document.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150 This is where our current knowledge ends. Until we either obtain a copy of the
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151 source for the DSP ROM or painstakingly reverse-engineer it, all we can do is
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
152 look at the few existing examples of E1-format melodies we can find (see below)
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
153 and experiment with putting different values in the various fields based on the
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
154 description in the L1M_AS001_1.pdf document.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156 Examples of E1-format melodies
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157 ==============================
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 We've been very fortunate to discover that the legendary TSM30 phone appears to
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160 have used the Melody E1 feature, and that there are a bunch of E1-format
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 melodies embedded in the famous TSM30 source from HispaPhreak. I have extracted
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162 these melodies, played them through the earpiece speaker on a Pirelli DP-L10
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163 phone running FreeCalypso Magnetite (our own FCDEV3B with a loudspeaker that we
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164 can actually use has not been built yet as of this writing), and found some of
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165 them to be quite pleasant-sounding. These extracted TSM30 melodies can be found
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166 here:
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
168 ftp://ftp.freecalypso.org/pub/GSM/ringtone/tsm30-melody-e1.tar.gz
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170 I also found a couple of melodies in our TCS211 reference semi-src under
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
171 chipsetsw/services/Audio/tests; these two melodies illustrate how one can load
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172 word2 and word3 the first time and then omit them afterward when reloading the
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173 same oscillator. (All of the TSM30 melodies always load all 4 words in every
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174 oscillator descriptor.)
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 Our own ASCII format for E1 melodies
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
177 ====================================
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 In this FreeCalypso host tools package we have a utility for decoding existing
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
180 Melody E1 binary bits into an amenable-to-study ASCII format, as well as a
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
181 utility for generating new E1-format binary melodies from an ASCII text source
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
182 in the same format. The ASCII format is of our own invention, and consists of
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
183 numeric fields which map directly to the various bit fields in the DSP+fw's
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
184 binary format.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
185
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
186 Our ASCII format for E1 melodies consists of 3 parts: an osc-set global header
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187 line, a sequence of time blocks, and an end line. The noteworthy aspects are:
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
188
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
189 * Each time block is given as a time line followed by 0 or more osc lines.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190 This lines must follow in direct succession without intervening blank or
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191 comment lines, and each time block must end with a blank line.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
192
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
193 * The end marker line is mandatory; having the ASCII file just end without it
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
194 is an error.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
195
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
196 Please see the source code for fc-e1decode and fc-e1gen for the rest.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
197
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
198 Some words regarding Melody E2
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199 ==============================
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
200
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
201 E1-format melodies are self-contained: if you have a valid binary melody file
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
202 in E1 format from whatever source, you can play it through the DSP of any
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
203 Calypso device that runs our TCS211-based Magnetite firmware. But it is not so
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
204 simple with Melody E2. In order to play a melody in E2 format, one needs not
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
205 only the melody file itself, but also the set of *.mwa (instrument wave) files
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
206 corresponding to the set of instruments used by that melody. It appears that
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
207 the melody group at TI had produced as many as 48 different instrument wave
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
208 tables: see the list in the non-production
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
209 #if (AUDIO_SIMULATION) || (AUDIO_L1_STANDALONE)
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
210 section of the Cust_audio_melody_E2_load_instrument() function in l1audio_cust.c
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
211 in both TSM30 and LoCosto/Peek sources. (The LoCosto version lists 48
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
212 instruments whereas the much earlier TSM30 version lists only 40 of them, thus
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
213 the list must have been added to over the course of TI history.) A given E2
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
214 melody selects a subset of 1 to 8 instruments out of the larger set to be used
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
215 in that melody, and these selected instrument waves are loaded into the DSP's
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
216 API RAM before the actual play of the melody itself.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
217
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
218 Unfortunately all we have are the *.mwa file _names_ for the 48 Melody E2
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
219 instruments that apparently existed at TI once upon a time, but not any of the
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
220 actual bits. The TSM30 source uses only Melody E1, not E2, thus we do not
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
221 currently have any source from which we can take any E2-format melody examples
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
222 or E2 instrument wave tables for TI's DSP. We also don't have any documentation
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
223 for any of these bits, and analysis of the Melody E2 code in L1 shows that it is
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
224 significantly different from E1. The code in TCS211 L1 that reads Melody E2
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
225 file bits is not of much help for making our own E2 melodies, as all of the real
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
226 magic happens in the DSP, not on the ARM side.
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
227
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
228 Thus our FreeCalypso hardware+firmware combination is capable of playing both E1
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
229 and E2 melodies, but we won't be able to exercise the latter capability until
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
230 and unless someone finds a surviving copy of some existing E2 melodies along
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
231 with the *.mwa instrument wave files they require, whether it is the same
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
232 instrument set as listed in the non-production section of l1audio_cust.c or a
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
233 different one. But if someone does obtain a set of such melody bit files, our
e50c3aa1152a doc/Melody_E1 written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
234 FreeCalypso devices running FreeCalypso firmware are ready to play them.