Hello, I am author of a Morse code training software written in Perl at http://starling.ws/morse Currently I output to *.wav and, if on Unix, convert to *.ogg. And that's okay for a trainer. But I have desire to upgrade the project to a real-time communication tool...or at least a Morse code audio mail routine. And I should like to avoid *.wav. I'd like some means of writing a pure sine wave straight to *.ogg just as I currently can to *.wav (using the Perl Audio::Wav module). This would involve turning on and off a sine wave of N mS duration with silences between. And the leading edges of these sine-wave segments require a not-too-abrupt rise time to avoid what Morse folks call "key clicks" and, if I read correctly, cause "pre echos" in compressed audio. Bearing in mind that I know nothing about audio codecs beyond being able to use Perl's Audio::Wav module, have I any hope of accomplishing such a task in Perl with output direct to *.ogg? Where would I start in such a case? Respectfully, Gan Starling, KY8D Kalamazoo MI USA
Monty writes:> > On Mon, Feb 20, 2006 at 09:39:35AM -0500, Gan Uesli Starling wrote: >> I'd like some means of writing a pure sine wave straight >> to *.ogg just as I currently can to *.wav (using the Perl >> Audio::Wav module). > > Slightly more fundamnetally complex, but it wouldn't bee too hard if > you're not *too* picky about the *exact* frequency you want to output.Anywhere in the range of 750 Hz to 800 Hz is close enough. All that counts is that it not waver to the human ear.> What will probably suck, though, is getting ahold of a perl binding > for libogg and enough of libvorbis to set a few packet fields. > >> This would involve turning on and off a sine wave of N mS >> duration with silences between. And the leading edges of >> these sine-wave segments require a not-too-abrupt rise time >> to avoid what Morse folks call "key clicks" and, if I read >> correctly, cause "pre echos" in compressed audio. > > I'd expect you'd want to build the tone packets directly from the > spectral math you'd need for a given sine wave; preecho would be > vaguely irrelevant.I can define a sine wave in Perl easily enough, or a haversine, or a bezier. Have done all three previously.>> Bearing in mind that I know nothing about audio codecs beyond >> being able to use Perl's Audio::Wav module, have I any hope of >> accomplishing such a task in Perl with output direct to *.ogg? >> Where would I start in such a case? > > Yes... but it depends on what perl bindings already exist. Building > the vorbis packets in Perl wouldn't be too bad (I expect you only need > a couple 'canned' packets), but stitching them into the Ogg stream > would require a bit more code if Ogg code isn't already available.They have some Perl modules for parsing and editing Ogg tags. But all I have seen otherwise were just wrappers for oggenc. Guess I need to have a look at the Ogg file format, encode some morse from *.wav using oggenc and see if I can grok the result. Did that once for an automotive road load data acquisition format. It took forever and wasn't fun. But the result was worthwile...in fact, I use it quite a lot. What docs ought I read first? And where might I find them? Thanks, Gan Starling, KY8D Kalamazoo MI USA
On Mon, Feb 20, 2006 at 09:39:35AM -0500, Gan Uesli Starling wrote:> I'd like some means of writing a pure sine wave straight > to *.ogg just as I currently can to *.wav (using the Perl > Audio::Wav module).Slightly more fundamnetally complex, but it wouldn't bee too hard if you're not *too* picky about the *exact* frequency you want to output. What will probably suck, though, is getting ahold of a perl binding for libogg and enough of libvorbis to set a few packet fields.> This would involve turning on and off a sine wave of N mS > duration with silences between. And the leading edges of > these sine-wave segments require a not-too-abrupt rise time > to avoid what Morse folks call "key clicks" and, if I read > correctly, cause "pre echos" in compressed audio.I'd expect you'd want to build the tone packets directly from the spectral math you'd need for a given sine wave; preecho would be vaguely irrelevant.> Bearing in mind that I know nothing about audio codecs beyond > being able to use Perl's Audio::Wav module, have I any hope of > accomplishing such a task in Perl with output direct to *.ogg? > Where would I start in such a case?Yes... but it depends on what perl bindings already exist. Building the vorbis packets in Perl wouldn't be too bad (I expect you only need a couple 'canned' packets), but stitching them into the Ogg stream would require a bit more code if Ogg code isn;t already available. Monty