[FFmpeg-soc] [soc] libavsequencer [PATCH 04/08] Track / pattern handling public API header file.
Vitor Sessak
vitor1001 at gmail.com
Thu Aug 12 20:59:52 CEST 2010
On 08/07/2010 09:46 PM, Sebastian Vater wrote:
> Vitor Sessak a écrit :
>> On 07/13/2010 10:57 PM, Sebastian Vater wrote:
>>> Vitor Sessak a écrit :
>>>> On 07/13/2010 09:35 PM, Sebastian Vater wrote:
>>>>> Vitor Sessak a écrit :
>>>>>> On 07/11/2010 10:07 PM, Sebastian Vater wrote:
>>>>>>> typedef struct AVSequencerTrackData {
[...]
>>>>>> if (instrument == previous_instrument) {...}
>>>>>
>>>>> Please note that instrument number 0 also differs whether you play the
>>>>> track in once mode (pattern play mode) and the instrument number was
>>>>> initialized in the previous order. All trackers don't output sound in
>>>>> that case, changing this would make this part incompatible.
>>>>
>>>> That's another good point, so I'm fine with instrument==0 meaning last
>>>> instrument. But if the behavior of setting instrument==0 is different
>>>> of the behavior of setting instrument==last_instrument, it should be
>>>> documented somewhere.
>>>
>>>>> TrackData is the octave, note, effect and effect data for each row,
>>>>> Track itself defines the structure containing it, i.e. number of rows,
>>>>> maybe track name, etc.
>>>>
>>>> Maybe AVSequencerRowData then?
>>>
>>> Nice name, will think on it!
So?
>>>>>
>>>>> This would require extending using 0x80-0xFF command effect which
>>>>> would
>>>>> conflict with synth sound handling (see there at the synth sound
>>>>> instructions).
>>>>
>>>> Ok, let me pose the question differently. Suppose we have an effect
>>>> foo. In MOD, effect foo is command 0x66 while in XM it is command
>>>> 0x55. What is the value of AVSEQ_TRACK_EFFECT_CMD_FOO? Or such thing
>>>> never happens?
>>>
>>> This happens very frequently, esp. between MOD/XM<=> S3M/IT.
>>> But this is part of the demuxer to convert the origins...
>>
>> Sure, but then doing as you do:
>>
>> /** 0x66 - Do foo to stuff */
>> #define AVSEQ_TRACK_EFFECT_CMD_FOO 0x66
>>
>> is confusing and misleading in comparison with
>>
>> /** Do foo to stuff */
>> #define AVSEQ_TRACK_EFFECT_CMD_FOO 0x66
So?
[...]
>
> diff --git a/libavsequencer/track.h b/libavsequencer/track.h
> new file mode 100755
> index 0000000..cf131af
> --- /dev/null
> +++ b/libavsequencer/track.h
> @@ -0,0 +1,1636 @@
> +/*
> + * AVSequencer track and pattern management
> + * Copyright (c) 2010 Sebastian Vater <cdgs.basty at googlemail.com>
> + *
> + * This file is part of FFmpeg.
> + *
> + * FFmpeg is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * FFmpeg is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with FFmpeg; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> + */
> +
> +#ifndef AVSEQUENCER_TRACK_H
> +#define AVSEQUENCER_TRACK_H
> +
> +#include "libavutil/log.h"
> +#include "libavformat/avformat.h"
> +
> +/**
> + * Song track effect structure, This structure is actually for one row
> + * and therefore actually pointed as an array with the amount of
> + * rows of the whole track.
> + * New fields can be added to the end with minor version bumps.
> + * Removal, reordering and changes to existing fields require a major
> + * version bump.
> + */
> +typedef struct AVSequencerTrackEffect {
> + /** Effect command byte. */
> + uint8_t command;
enum...
> + /** Effect command data word. */
> + uint16_t data;
> +} AVSequencerTrackEffect;
> +
> +/** AVSequencerTrackEffect->note values. */
> +enum AVSequencerTrackDataNote {
> + /** --- */
> + AVSEQ_TRACK_DATA_NOTE_NONE = 0,
> +
> + /** C-n */
> + AVSEQ_TRACK_DATA_NOTE_C = 1,
> +
> + /** C#n = Dbn */
> + AVSEQ_TRACK_DATA_NOTE_C_SHARP = 2,
> +
> + /** D-n */
> + AVSEQ_TRACK_DATA_NOTE_D = 3,
> +
> + /** D#n = Ebn */
> + AVSEQ_TRACK_DATA_NOTE_D_SHARP = 4,
> +
> + /** E-n */
> + AVSEQ_TRACK_DATA_NOTE_E = 5,
> +
> + /** F-n */
> + AVSEQ_TRACK_DATA_NOTE_F = 6,
> +
> + /** F#n = Gbn */
> + AVSEQ_TRACK_DATA_NOTE_F_SHARP = 7,
> +
> + /** G-n */
> + AVSEQ_TRACK_DATA_NOTE_G = 8,
> +
> + /** G#n = Abn */
> + AVSEQ_TRACK_DATA_NOTE_G_SHARP = 9,
> +
> + /** A-n */
> + AVSEQ_TRACK_DATA_NOTE_A = 10,
> +
> + /** A#n = Bbn */
> + AVSEQ_TRACK_DATA_NOTE_A_SHARP = 11,
> +
> + /** B-n = H-n */
> + AVSEQ_TRACK_DATA_NOTE_B = 12,
> +
> + /** ^^^ = note kill */
> + AVSEQ_TRACK_DATA_NOTE_KILL = -1,
> +
> + /** ^^- = note off */
> + AVSEQ_TRACK_DATA_NOTE_OFF = -2,
> +
> + /** === = keyoff note */
> + AVSEQ_TRACK_DATA_NOTE_KEYOFF = -3,
> +
> + /** -|- = hold delay */
> + AVSEQ_TRACK_DATA_NOTE_HOLD_DELAY = -4,
> +
> + /** -\- = note fade */
> + AVSEQ_TRACK_DATA_NOTE_FADE = -5,
> +
> + /** END = pattern end marker */
> + AVSEQ_TRACK_DATA_NOTE_END = -16,
> +};
Why hardcoding values? Why not just use:
/** AVSequencerTrackEffect->note values. */
enum AVSequencerTrackDataNote {
/** --- */
AVSEQ_TRACK_DATA_NOTE_NONE,
/** C-n */
AVSEQ_TRACK_DATA_NOTE_C,
/** C#n = Dbn */
AVSEQ_TRACK_DATA_NOTE_C_SHARP,
[...]
}
And let the compiler assign whatever numbers it seems fit?
> +
> +/**
> + * Song track data structure, This structure is actually for one row
> + * and therefore actually pointed as an array with the amount of
> + * rows of the whole track.
> + * New fields can be added to the end with minor version bumps.
> + * Removal, reordering and changes to existing fields require a major
> + * version bump.
> + */
> +typedef struct AVSequencerTrackData {
> + /** Array (of size effects) of pointers containing all effects
> + used by this track. */
> + AVSequencerTrackEffect **effects_data;
> +
> + /** Number of effects used by this track. */
> + uint16_t effects;
> +
> + /** Which octave the note is played upon, if note is a positive
> + value (defaults to 4). Allowed values are in the [0:9] range,
> + since the keyboard definition table has 120 entries (10 octave
> + range * 12 notes per octave), also expect trouble with most
> + trackers if values outside this range are used. */
> + uint8_t octave;
> +
> + /** Note to be played (see defines below, n is octave number). */
which defines?
> + int8_t note;
enum?
> + /** Number of instrument to be played or 0 to take previous one. */
> + uint16_t instrument;
> +} AVSequencerTrackData;
> +
> +/** AVSequencerTrack->compat_flags bitfield. */
> +enum AVSequencerTrackCompatFlags {
> + AVSEQ_TRACK_COMPAT_FLAG_SAMPLE_OFFSET = 0x01, ///< Sample offset beyond end of sample will be ignored (IT compatibility)
> + AVSEQ_TRACK_COMPAT_FLAG_TONE_PORTA = 0x02, ///< Share tone portamento memory with portamentoes and unlock tone portamento samples and adjusts frequency to: new_freq = freq * new_rate / old_rate. If an instrument number is given the envelope will be retriggered (IT compatibility).
> + AVSEQ_TRACK_COMPAT_FLAG_SLIDES = 0x04, ///< Portamentos of same type share the same memory (e.g. porta up/fine porta up)
> + AVSEQ_TRACK_COMPAT_FLAG_VOLUME_SLIDES = 0x08, ///< All except portamento slides share the same memory (e.g. volume/panning slides)
> + AVSEQ_TRACK_COMPAT_FLAG_OP_SLIDES = 0x10, ///< Oppositional portamento directions don't share the same memory (e.g. porta up and porta down)
> + AVSEQ_TRACK_COMPAT_FLAG_OP_VOLUME_SLIDES = 0x20, ///< Oppositional non-portamento slide directions don't share the same memory
> + AVSEQ_TRACK_COMPAT_FLAG_VOLUME_PITCH = 0x40, ///< Volume & pitch slides share same memory (S3M compatibility)
> +};
> +
> +/** AVSequencerTrack->flags bitfield. */
> +enum AVSequencerTrackFlags {
> + AVSEQ_TRACK_FLAG_USE_TIMING = 0x01, ///< Use track timing fields
> + AVSEQ_TRACK_FLAG_SPD_TIMING = 0x02, ///< SPD speed timing instead of BpM
> + AVSEQ_TRACK_FLAG_PANNING = 0x04, ///< Use track panning and sub-panning fields
> + AVSEQ_TRACK_FLAG_SURROUND = 0x08, ///< Use track surround panning
> + AVSEQ_TRACK_FLAG_REVERSE = 0x10, ///< Playback of track in backward direction
> +};
> +
> +/**
> + * Song track structure.
> + * New fields can be added to the end with minor version bumps.
> + * Removal, reordering and changes to existing fields require a major
> + * version bump.
> + */
> +typedef struct AVSequencerTrack {
> + /**
> + * information on struct for av_log
> + * - set by avseq_alloc_context
> + */
> + const AVClass *av_class;
> +
> + /** Metadata information: Original track file name, track
> + title, track message, track artist, track album,
> + track begin and finish date of composition and comment. */
> + AVMetadata *metadata;
> +
> + /** AVSequencerTrackData pointer to array of track data. */
> + AVSequencerTrackData *data;
> + /** Last valid row of track (defaults to 63 = 0x3F) which
> + is the default for most trackers (64 rows per pattern). */
> + uint16_t last_row;
Again, is this needed to play a track?
> + /** Track global volume (defaults to 255 = no volume scaling). */
> + uint8_t volume;
> +
> + /** Sub-volume level for this track. This is basically track
> + global volume divided by 256, but the sub-volume doesn't
> + account into actual mixer output (defaults 0). */
> + uint8_t sub_volume;
> +
> + /** Stereo panning level for this track (defaults to
> + -128 = central stereo panning). */
> + int8_t panning;
> +
> + /** Stereo track sub-panning level for this channel. This is
> + basically track panning divided by 256, but the sub-panning
> + doesn't account into actual mixer output (defaults 0). */
> + uint8_t sub_panning;
> +
> + /** Track transpose. Add this value to octave * 12 + note to
> + get the final octave / note played (defaults to 0). */
> + int8_t transpose;
> + /** Compatibility flags for playback. There are rare cases
> + where track handling can not be mapped into internal
> + playback engine and have to be handled specially. For
> + each sub-song which needs this, this will define new
> + flags which tag the player to handle it to that special
> + way. */
> + uint8_t compat_flags;
enum?
> + /** Track playback flags. Some sequencers feature
> + surround panning or allow initial reverse playback,
> + different timing methods which have all to be taken
> + care specially in the internal playback engine. */
> + uint8_t flags;
enum?
-Vitor
More information about the FFmpeg-soc
mailing list