On Fri, May 26, 2023 at 10:43 AM Oleg wrote:
> Hi all,
> While playing with generating audio tones (thanks for the manual
> <https://www.youtube.com/watch?v=3U6OZaGnYcc>, Alan!), I wonder what I need
> to write to /dev/tone to get constant signal, 100% PWM on the audio pin,
> that is beep of maximum volume?

Hey there Oleg :-)

Here is a documentation on how to create your own device driver and
general description on how drivers work in NuttX:

https://nuttx.apache.org/docs/latest/components/drivers/index.html

On FreeBSD there is a /dev/speaker device handled by a kernel module
that can text commands and convert them to a PC speaker tones. That
could be a reference point too if you want to write a simple melody
player :-)

For instance this will play Star Trek tune:
l2b.f+.p16a.c+.p l4mne8a2mspg+e8c+f+8b2

https://man.freebsd.org/cgi/man.cgi?query=speaker
https://github.com/freebsd/freebsd-src/blob/main/sys/dev/speaker/spkr.c

     Applications may call ioctl(2) on a speaker file descriptor to control
     the speaker driver    directly; definitions for the ioctl(2) interface are
     in    <dev/speaker/speaker.h>.  The tone_t structure used in
these calls has
     two fields, specifying a frequency    (in Hz)    and a duration
(in 1/100ths of
     a second).     A frequency of    zero is    interpreted as a rest.

     At    present    there are two such ioctl(2) calls.  SPKRTONE
accepts a pointer
     to    a single tone structure    as third argument and plays it.
   SPKRTUNE ac-
     cepts a pointer to    the first of an    array of tone structures and plays
     them in continuous    sequence; this array must be terminated    by a final
     member with a zero    duration.

     The play-string language is modeled on the    PLAY statement conventions of
     IBM Advanced BASIC    2.0.  The MB, MF, and X    primitives of PLAY are not
     useful in a timesharing environment and are omitted.  The `octave-track-
     ing' feature and the slur mark are    new.

     There are 84 accessible notes numbered 1-84 in 7 octaves, each running
     from C to B, numbered 0-6;    the scale is equal-tempered A440 and octave 3
     starts with middle    C.  By default,    the play function emits
  half-second
     notes with    the last 1/16th    second being `rest time'.

     Play strings are interpreted left to right    as a series of play command
     groups; letter case is ignored.  Play command groups are as follows:

     CDEFGAB    Letters    A through G cause the corresponding note to be played
        in the current octave.    A note letter may optionally be    fol-
        lowed by an "accidental    sign", one of #    + or -;    the first two
        of these cause it to be    sharped    one half-tone, the last    causes
        it to be flatted one half-tone.     It may    also be    followed by a
        time value number and by sustain dots (see below).  Time val-
        ues are    interpreted as for the L command below.

     O n    If n is    numeric, this sets the current octave.    n may also be
        one of L or N to enable    or disable octave-tracking (it is dis-
        abled by default).  When octave-tracking is on,    interpretation
        of a pair of letter notes will change octaves if necessary in
        order to make the smallest possible jump between notes.     Thus
        ``olbc'' will be played    as ``olb>c'', and ``olcb'' as
        ``olc<b''.  Octave locking is disabled for one letter note
        following >, < and O[0123456].    (The octave-locking feature is
        not supported in IBM BASIC.)

     >        Bump the current octave    up one.

     <        Drop the current octave    down one.

     N n    Play note n, n being 1 to 84 or    0 for a    rest of
current    time
        value.    May be followed    by sustain dots.

     L n    Sets the current time value for    notes.    The default is L4,
        quarter    or crotchet notes.  The    lowest possible    value is 1;
        values up to 64    are accepted.  L1 sets whole notes, L2 sets
        half notes, L4 sets quarter notes, etc.

     P n    Pause (rest), with n interpreted as for    L n.  May be followed
        by sustain dots.  May also be written ~.

     T n    Sets the number    of quarter notes per minute; default is    120.
        Musical    names for common tempi are:

                      Tempo          Beats Per    Minute
              very slow          Larghissimo
                      Largo          40-60
                      Larghetto          60-66
                      Grave
                      Lento
                      Adagio          66-76
              slow          Adagietto
                      Andante          76-108
              medium          Andantino
                      Moderato          108-120
              fast          Allegretto
                      Allegro          120-168
                      Vivace
                      Veloce
                      Presto          168-208
              very fast          Prestissimo

     M[LNS]    Set articulation.  MN (N for normal) is    the default; the last
        1/8th of the note's value is rest time.     You can set ML    for
        legato (no rest    space) or MS for staccato (1/4 rest space).

     Notes (that is, CDEFGAB or    N command character groups) may
be followed by
     sustain dots.  Each dot causes the    note's value to    be
lengthened by one-
     half for each one.     Thus, a note dotted once is held for 3/2 of its un-
     dotted value; dotted twice, it is held 9/4, and three times would give
     27/8.

     A note and    its sustain dots may also be followed by a slur
mark (under-
     score).  This causes the normal micro-rest    after the note to be filled
     in, slurring it to    the next one.  (The slur feature is not
supported in
     IBM BASIC.)

     Whitespace    in play    strings    is simply skipped and may be
used to separate
     melody sections.


-- 
CeDeROM, SQ7MHZ, http://www.tomek.cedro.info

Reply via email to