PROPUESTA DE APLICACION PARA EL INTERCAMBIO DE FICHEROS KDENLIVE  ARDOUR3

PROPUESTA DE APLICACION PARA EL INTERCAMBIO DE FICHEROS KDENLIVE ARDOUR3

NECESIDADES

Trabajando de manera distribuida necesitamos crear un est谩ndard de trabajo com煤n entre los distintos softs de desarrollo audiovisual en sistemas GNU/Linux.

Tomamos como ejemplo la creaci贸n de un documental colaborativo producido en Olholivre.NET usando solo herramientas libres, Cinelerra para su edici贸n y Ardour3+XJadeo para la postproducci贸n de sonido. En la actualidad hemos pensado que una buena manera de actualizar este proyecto ser铆a poder experimentar con otro editor de v铆deo, por lo que apostamos por trabajar usando Kdenlive.

De estos dos paquetes no parece existir un sistema de intercambio claro de archivos, por lo que, en esta primera fase, crearemos una peque帽a aplicaci贸n para realizar un transofrmaci贸n del proyecto ya realizado bajo Cinelerra a Ardour3, y as铆 poder trabajar el audio de una mucho m谩s c贸moda y sincronizada, tal y como se trabaja con otros softs comerciales.

Proyecto & Documentaci贸n

  • Usaremos la wiki de Olholivre.NET como elemento de documentaci贸n en el desarrollo de esta propuesta del conversor de sesiones y el repositiorio GIT de Interferencies para el intercambio de c贸digo.
  • Para la publicaci贸n del c贸digo los recursos de Interfer猫ncies en GitHUB – http://github.com/interferencies

ANALISIS DE POSIBLES STANDARES DE INTERCAMBIO

Unos posibles formatos de intercambio de datos utilizados:

OMF

AAF

EDL

ARDOUR SESSION FILE

KDENLIVE – MLT

FUENTES SOBRE USOS DE ARDOUR

SOFT DE INTERCAMBIO

SOFT DE SYNCRO VIDEO/AUDIO

Sistema de sincronizaci贸n de video con el proyecto bajo Ardour.

TAREAS

  • Localizar info sobre la estrucutura del EDL de Cinelerra
  • Localizar info sobre la estructura del XML que usa Ardour3 para definir las sesiones
  • Reutilizar el scrypt de KdenParse para realizar el paso de Cinelerra -> Ardour3

A TENER EN CUENTA…

  • Debemos poder apuntar las pistas dnd nos interese, por lo menos, a un master o algo as铆.. as铆 que, habr谩 que hacer un poco m谩s interactivo. Esto no est谩 definido en Cinelerra..
  • Ardour3 solo abre archivos WAV/FLAC/AIFF/驴OGG? por lo tanto, si existe aglun archivo en formato MP3 deber铆amos codificarlo a WAV/OGG

PROCESO DE CONSTRUCCI脫N DEL NUEVO PROYECTO

Kdenlive trabaja las pistas de audio de los v铆deos dentro de una misma pista.. por lo que, tendremos que trascodear los clips de v铆deo para extraer el audio. Para no perder informaci贸n realizaremos la exportaci贸n de ese audio en format WAV, aunque podr铆amos utilizar tb FLAC, siendo este menos pesado, sin perdidas y le铆ble por Ardour3.

  1. Averiguar las fuentes del documento
  2. Transcodear fuentes MOV/AVI/…(todos los formatos que acepte Kdenlive) -> WAV
  3. Crear estructura de un proyecto Ardour3
  4. Localizar regiones del proyecto Kdenlive y a帽adirlas al proyecto Ardour3

Documentaci贸n relacionada con las librer铆as y desarrollo

  • Python + pyGTK + modulos de gestion de DOM (mirar ejemplo del kdenlive)
  • Necesitaremos hacer las codificaciones de ficheros no validos en Ardour, podemos trabajar con FFMPEG o una pipe en Gstream
  • BeautifulSoup – librer铆as de parseo de documentos en Python – http://www.crummy.com/software/BeautifulSoup/
  • LXML – Librer铆a de proceso de XML y HTML bajo python – http://lxml.de/ – Debian Package: python-lxml
  • Algunos ejemplos de trabajo con ficheros bajo Python – http://code.google.com/p/asi-iesenlaces/wiki/ArchivosyDirectoriosConPython
  • Trabajo con multipistas en ecasound – http://eca.cx/ecasound/Documentation/examples.html#multitrack
  • Trabajo con Sox y audio – http://sox.sourceforge.net/sox.html

Proceso de c谩lculo de posiciones en Kdenlive

El valor utilizado en el XML para marcar duraciones y entrads y salidas en la linea de tiempos se referencia por los frames del clip.

Un ejemplo: Tenemos un clip de 8 seg y 12 frames en un proyecto de 25fps, el valor mostrado en el xml es 8*25+12=212

FrmProd = (msec/1000)*25+(

ESTRUCTURA DE UN SESSION ARDOUR

Usaremos un proyecto creado desde cero con una pista de audio ya creada (Project)

Project

/ analysis

/ dead

/ export

/externals

instant.xml

/ interchange

    / Project

        / audiofiles

            Region-L.wav

            Region-R.wav

        / midifiles

/ peaks

/ plugins

Project.ardour

Project.history

Project.ardour

Fichero XML con al configuraci贸n de la sesion

Cabecera

<?xml version="1.0" encoding="UTF-8"?>

Seccion que engloba todo el contenido

<Session version="3.0.0" name="Project" sample-rate="48000" id-counter="443" event-counter="0">

Seccion de configuracion

<Config>

Definici贸n de Opciones

<Option name="xfade-model" value="FullCrossfade"/>

<Option name="auto-xfade" value="1"/>

...

</Config>

Metadata

No los tenemos definidos en este caso pero supongo que ir铆an como atributos de este tag

<Metadata/>

Fuentes de sonido

Primera parte importante a tratar con el de KDEnlive.

Tener en cuenta que las fuentes est茅reo se definen independientes por canal, por tanto tendremos dos fuentes por fuente est茅reo.. supongo que la parte multicanal tambien se dividir谩n en canales (0 to n).

<Sources>

    <Source name="source-L.wav" type="audio" flags="Writable,CanRename,RemovableIfEmpty" id="331" channel="0" origin="/path/source.wav"/>

    <Source name="source-R.wav" type="audio" flags="Writable,CanRename,RemovableIfEmpty" id="333" channel="1" origin="/path/source.wav"/>

    ...

<Sources>

Regions

Aqu铆 definimos las posiciones en la l铆nea de tiempos sobre las cuales insertamos un tramo de una fuente. Se hace referencia al identificador del canal de cada fuente.

<Regions>

    <Region name="region-name" position="0" lenght="100000" stretch="1" muted="0" opaque="1" locked="0" automatic="0" whole-file="0" import="0" external="0" sync-marked="0" left-of-split="0" right-of-split="0" hidden="0" position-locked="0" valid-transients="0" start="0" sync-position="0" layer="0" ancestral-start="0" ancestral-length="0" shift="1" positional-lock-style="AudioTime" envelope-active="0" default-fade-in="1" default-fade-out="1" fade-in-active="1" fade-out-active="1" scale-amplitude="1" id="319" type="audio" first-edit="nothing" source-0="317" source-1="318" master-source-0="317" master-source-1="318" channels="2">

Definimos algunas opciones de la regi贸n sobre la cual trabajamos:

<Envelope default="yes"/>

<FadeIn default="yes"/>

<FadeOut default="yes"/>

</Region>

....

</Regions>

Localizaciones

Puntos que marcamos en la linea de tiempos como el IN/OUT(name=session) del proyecto, marcas, ….

<Locations>

    <Location id="83" name="Loop" start="0" end="1000000" flags="IsAutoLoop,IsHidden" locked="no" position-lock-style="AudioTime"/>

    <Location id="84" name="Punch" start="0" end="1" flags="IsAutoPunch,IsHidden" locked="no" position-lock-style="AudioTime"/>

    <Location id="393" name="session" start="0" end="100000" flags="IsSessionRange" locked="no" position-lock-style="AudioTime"/>

    ....

</Locations>

Bundles

Configuraciones relacionadas con las conexiones de la session. En este caso, no estan definidas

<Bundles/>

Routes

Rutas de comunicacions de los puertos de In/Out de Ardour, importante la definici贸n pq son necesarias para la creacion de los buses/pistas y regiones de la session.

<Routes>

    <Route id="22" name="master" default-type="audio" flags="MasterOut" active="yes" phase-invert="000000" denormal-protection="no" meter-point="MeterPostFAder" order-keys="editor=0:singal=0" self-solo="no" soloed-by-upstream="0" soloed-by-downstream="0" solo-isolated="no" solo-safe="no">

InOUt

Creaci贸n del puerto entrada o salida y sus conexiones Hard + Ardour buses

        <IO name="master" id="39" direction="Input" default-types="audio" user-latency="0">

Puerto

Definici贸n del puertos dentro del input del master

            <Port type="audio" name="master/audio_in_1">

                <Connection other="Audio/audio_out 1"/>

                <Connection other="Audio 1/audio_out 1"/>

            </Port>

            ...

        </IO>

        <IO name="master" id="40" direction="Output" default-type="audio" user-latency="0">

            <Port type="audio" name="master/audio_out 1">

                <Connection other="system:playback_1"

            </Port>

            ...

        </IO>

        <Controllable name="solo" id="24" flags="Toggle" value="0.000000000000"/>

        <Controllable name="mute" id="187" flags="Toggle" value="0.000000000000"/>

        <Mutemaster mute-point="PreFader,PostFader,Listen,Main" muted="no"/>

        <RemoteControl id="1"/>

        <Pannable>

            <Controllable name="pan-azimuth" id="30" flags="" value="0.500000000000"/>

            <Controllable name="pan-width" id="34" flags="" value="0.000000000000"/>

            <Controllable name="pan-elevation" id="32" flags="" value="0.000000000000"/>

            <Controllable name="pan-frontback" id="36" flags="" value="0.000000000000"/>

            <Controllable name="pan-lfe" id="38" flags="" value="0.000000000000"/>

        </Pannable>

        <Processor id="41" name="Amp" active="yes" user-latency="0" type="amp">

            <Controllable name="gaincontrol" id="43" flags="GainLike" value="1.000000000000"/>

        </Processor>

        <Processor id="44" name="Meter" active="yes" user-latency="0" type="meter"/>

        <Processor id="45" name="master" active="yes" user-latency="0" own-input="yes" own-output="no" output="master" type="main-outs" role="Main">

            <PannerShell bypassed="no">

                <Panner type="VBAP 2D panner"/>

            </PannerShell>

        </Processor>

    </Route>

    ...

</Routes>

Playlist

Podemos trabajar con varias capas dentro de cada uno de las pistas, cada capa se considera una playlist con un conjunto de regiones definidas en ella.

<Playlists>

    <Playlist id="367" name="Audio" type="audio" orig-diskstream-id="366" frozen="no" combine-ops="0">

        <Region name="region.1" position="0" length="1000000" stretch="1" muted="0" opaque="1" locked="0" automatic="0" whole-file="0" import="0" external="1" sync-marked="0" laeft-of-split="0" right-of-split="0" hidden="0" position-locked="0" valid-transcients="0" shift="1" positional-lock-style="AudioTime" envelope-active="0" default-fade-in="1" default-fade-out="1" fade-in-active="1" fade-out-active="1" scale-amplitude="1" id="386" type="audio" first-edit="nothing" source-0="331" source-1="333" master-source-0="331" master-source-1="333" channels="2">

            <Extra>

                <GUI waveform-visible="yes" envelope-visible="no" waveform-rectified="no" waveform-logscaled="no"/>

            </Extra>

            <Envelope default="yes"/>

            <FadeIn default="yes"/>

            <FadeOut default="yes"/>

        </Region>

    </Playlist>

    ...

</Playlists>

<UnusedPlaylists/>

Grupos de Rutas

Seguimos definiendo relaciones de componentes de ardour con los IO del sistema.

<RouteGroups/>

Claqueta

Definimos la claqueta..

<Click>

    <IO name="click" id="47" direction="Output" default-type="audio" user-latency="0">

        <Port type="audio" name="click/audio_out 1">

            <Connection other="system:playback_1">

        </Port>

        ...

    </IO>

</Click>

<NamedSelections/>

Monitores

Definimos la posici贸n de los altavoces

<Speakers>

    <Speaker azimuth="0" elevation="0" distance="1"/>

    <Speaker azimuth="180" elevation="0" distance="0"/>

</Speakers>

Tempo

Definimos el tempo de la sesion

<TempoMap>

    <Tempo start="1|1|0" beats-per-minute="120.000000" note-type="4.000000" movable="no"/>

    <Meter start="1|1|0" note-type="4.000000" beats-per-bar="4.000000" movable="no"/>

</TempoMap>

Control Midi

Definimos los m茅toso de control por MIDI (GEneric midi..y listo..)

<ControlProtocols>

    <Protocol name="Generic MIDI" feedback="0" feedback-interval="10000" active="yes">

        <Controls/>

    </Protocol>

    ...

</ControlProtocols>

Xtras de la Sesion

Extras de la sesion

<Extra>

    <ClockModes>

        <Clock name="primary" mode="Timecode" on="yes"/>

        ....

</Session>