Subject: [LilyPond] [Général] Timline pour musique de film

From: Raphael Hardy via LilyPond <[email-masked]>
Date: Wed, 01 May 2024 13:11:32 +0000

J’avais vu passer [ce thread](https://lists.gnu.org/archive/html/lilypond-user/2024-03/msg00125.html) intéressant sur la liste anglophone, mais peut-être que vous l’avez vu aussi?
A ce que je comprends cette approche est plutôt basée sur le midi

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/timline-pour-musique-de-film/5696/3).

Pour créer un nouveau sujet, écrivez à [[email-masked]](mailto:[email-masked]) ou visitez la [page d'accueil de lilypond.community](https://lilypond.community).

---

From: MartialR via LilyPond <[email-masked]>
Date: Wed, 01 May 2024 13:33:01 +0000

Bonjour, 
Mais c'est parfait pour mesurer le temps 
Merci Jean 

```
#(define (Custom_engraver!! context)
   (define (format-time seconds)
     (let* ((minutes (euclidean-quotient seconds 60))
            (rest (euclidean-remainder seconds 60))
            (seconds (euclidean-quotient rest 1))
            (rest (euclidean-remainder rest 1)))
       (string-append (if (zero? minutes) "" (format #f "~a:" minutes))
                      (format #f "~a:~a" seconds (round (* rest 24))))))
   (let ((wholes-per-minute 15)
         (last-time ZERO-MOMENT)
         (total-time 0)
         (marks '()))
     (make-engraver
      ((process-music engraver)
       (let* ((new-time (ly:context-current-moment context))
              (time-delta (ly:moment-main (ly:moment-sub new-time last-time)))
              (new-wholes-per-minute
               (and=> (ly:context-property context 'tempoWholesPerMinute #f)
                      ly:moment-main)))
         (set! total-time
               (+ total-time (* 60 (/ time-delta wholes-per-minute))))
         (set! last-time new-time)
         (when new-wholes-per-minute
           (set! wholes-per-minute new-wholes-per-minute))))
      (acknowledgers
       ((text-mark-interface engraver grob source-engraver)
        (set! marks (cons grob marks))))
      ((process-acknowledged engraver)
       (for-each (lambda (grob)
                   (when (assq-ref (ly:grob-property grob 'details) 'time-mark)
                     (ly:grob-set-property! grob 'text (format-time
                                                        total-time))))
                 marks)
       (set! marks '())))))

\layout {
  \context {
    \Score
    \consists #Custom_engraver!!
  }
}

timeMark = \tweak details.time-mark ##t \tweak color "red" \textEndMark
"Abracadabra"

{
  \tempo 4 = 80 
  c' c' c' c'
  \timeMark
     \tempo 4 = 180 
  c' c' c' c'
  \timeMark
  \tempo 4 = 60
  \repeat unfold 60 c'4
  \timeMark
 
}
```

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/timline-pour-musique-de-film/5696/4).

---

From: Olivier Charade via LilyPond <[email-masked]>
Date: Thu, 02 May 2024 08:19:19 +0000

Houlà!
Je m'attendais à ce que la réponse ne soit pas simple mais là, il faut le niveau Champollion pour tout déchiffrer.
Déjà merci beaucoup, c'est super : même sans comprendre j'obtiens un affichage qui s'approche de ce que je cherche.
Je cherche à comprendre en me basant sur les langages que je connais.
Déjà le format n'est pas exactement comme en C, mais je pense que je dois pouvoir ajouter l'heure devant (les time codes commencent classiquement à 1:00:00.00; on m'a dit une fois que le premier chiffre correspondait historiquement au numéro de bobine).
Mais comment force-t-on la valeur du temps, que ce soit au début ou en cours de morceau? Je n'ai pas compris d'où sortait ZERO-MOMENT.
Ensuite, je comprends qu'il y a un tempo par défaut dans Lilypond à 60 à la noire puisqu'il arrive à sortir un time code en fin de première mesure avant toute indication de tempo?
Comment j'habille \timeMark (box autour, centré sur barre de mesure, etc.)?

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/timline-pour-musique-de-film/5696/5).

---

From: MartialR via LilyPond <[email-masked]>
Date: Thu, 02 May 2024 09:36:18 +0000

Bonjour
plus proche du modèle  : 

```
\version "2.24"
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%la fonction pour afficheir le temps d'après Jean

\layout {
  \context {
    \Score

timeMark = \tweak details.time-mark ##t \tweak color "red" \textEndMark 
"Abracadabra"
%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% le format 
rhytMic = {
   \override Score.MetronomeMark.padding = #4
  \clef percussion
  \hide TabNoteHead
  \hide NoteHead
  \override NoteHead.no-ledgers = ##t
  \override StaffSymbol.line-count = #1
  \numericTimeSignature
  \stemDown
}

structure = {

 \tempo 4= 60 
  r1 \bar"||" 
  r1 \timeMark r1 
 % \tempo 4=120
  \timeMark
  r1 
  \time 3/4
   R2.
  \timeMark
  \tempo 4 = 180
  \time 4/4
  r1 r1
  \timeMark
}

<<
  \new RhythmicStaff
  \with {   } {
    
    \new Voice = "myRhythm" \relative {
      \rhytMic
     \time 4/4
    \tweak color "red" \textMark "0.0"
   \repeat unfold 8 {  c4  c c c  }

    }
  }
  \new Staff \relative { 
   R1 R1 R1 R1 
   R2. 
   R1 R1 R1
  }
 \new Devnull \structure

```

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/timline-pour-musique-de-film/5696/6).

---

From: MartialR via LilyPond <[email-masked]>
Date: Thu, 02 May 2024 16:05:25 +0000

Je n'arrive pas à mattre une position fixe du timeMark 
mais ça approche un peu plus du modèle. 

```
\version "2.24"

\layout {
  \context {
    \Score

timeMark =  {
  \tweak X-offset #-1.5
  \tweak details.time-mark ##t \tweak color "red"
  \textMark
  "Abracadabra" \mark \default
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\header {  }
\paper {
  top-margin = 20
  indent =  20
}
%mise en forme générale
\layout {
  \context {
    \Score
    \override MetronomeMark.padding = #14
    \override RehearsalMark.padding = #10
    % \override StaffGrouper.staff-staff-spacing.basic-distance = #15
  }
  \context {
    \Voice
    \override StaffGrouper.
    staffgroup-staff-spacing.basic-distance = #15
  }

}

% le format
rhytMicForme = {
  \clef percussion
  \hide TabNoteHead
  \hide NoteHead

Flute = \relative {
  R1 R1 R1 R1
  R2.
  R1 R1 R1
}

structure = {
  \set Score.rehearsalMarkFormatter = #format-mark-circle-numbers
  \tempo 4=72
  r1 \timeMark
  \bar"||"
  r1 \timeMark
  r1 \timeMark
  % \tempo 4=120
  r1  \timeMark
  \time 3/4
  R2. \timeMark
  \tempo 4 = 180
  \time 4/4
  r1 \timeMark
  r1 \timeMark
}

rythmBarre =\relative {
  \rhytMicForme
  \time 4/4
  \tweak color "red" \textMark "0.0"
  c4 c c c
  \repeat unfold 2 {  c4  c c c  }
  c c  c
  \repeat unfold 4 {  c4  c c c  }
}

descriptionText = {
  r1  \textMark\markup\bold\column{ \box"Underwater Scene"  \normal-text "X" }
  r1 r1 r1
  r4 r4
  \textMark\markup\bold\column{ \box"Landscape"  \normal-text "X" }
}

\score {
  <<
    \new RhythmicStaff
    \with { instrumentName = \markup\column{ "Hitpoints" "Click Track" }  }
    \new Voice = "myRhythm" \rythmBarre
        \new Lyrics { \descriptionText }
        \new  Devnull{ \structure }
    \new Staff \with { instrumentName = "Flute" }
    { \Flute }
  \layout { }
}
```

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/timline-pour-musique-de-film/5696/7).

---

From: Olivier Charade via LilyPond <[email-masked]>
Date: Fri, 03 May 2024 11:08:48 +0000

C'est vrai qu'on approche.
Au niveau style, j'ai finalement opté pour laisser les têtes de notes avec
drumStyleTable = #percussion-style
et des mesures du genre
{\timeMark cab4 4 4 4}
que je multiplie avec unfold sauf si il faut une description de scène dedans

J'ai trouvé comment afficher mon time code en commençant par l'heure.

Il ne me manque plus que trouver comment forcer la valeur du premier moment et la reforcer en cours de route. Là, ça me dépasse totalement.

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/timline-pour-musique-de-film/5696/8).

---

From: Olivier Charade via LilyPond <[email-masked]>
Date: Fri, 03 May 2024 12:41:59 +0000

En implantant le code dans la "vraie" partition, je m'aperçois que le "Abracadabra" est nécessaire alors que je prenais ça pour un private joke.
Je veux bien qu'on m'explique.

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/timline-pour-musique-de-film/5696/9).

---

From: MartialR via LilyPond <[email-masked]>
Date: Fri, 03 May 2024 12:54:13 +0000

la fonction textMark attends un  du texte 
textMark = \mark \markup "texte" 

on peut mettre "?" à la place "Abracadabra"
Jean est joueur :-) 

```
timeMark =  {
  \tweak X-offset #-1.5
  "?"  \mark \default
}
```

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/timline-pour-musique-de-film/5696/10).

---

From: Olivier Charade via LilyPond <[email-masked]>
Date: Fri, 03 May 2024 13:08:16 +0000

OK. Donc il y a quelque part une astuce en langue de magicien pour remplacer ce texte par la valeur du time code.
Je me rends compte que j'ai un problème de priorité entre le tempo et les reharsal marks. Le tempo veut toujours se mettre en dessous. J'ai sauté une ligne dans l'exemple?

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/timline-pour-musique-de-film/5696/11).

---

From: MartialR via LilyPond <[email-masked]>
Date: Fri, 03 May 2024 17:17:56 +0000

moi aussi je n'ai pas encore trouvé ;

quote="olicha, post:11, topic:5696, full:true"]
Je me rends compte que j'ai un problème de priorité entre le time code et les reharsal marks. Il faudrait le time code au-dessus.
[/quote]

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/timline-pour-musique-de-film/5696/12).

---

From: xavier via LilyPond <[email-masked]>
Date: Fri, 03 May 2024 19:11:12 +0000

Effectivement `RehearsalMark` a une valeur plus élevée de `outside-staff-priority` que `TextMark` (cf [NR A.18](https://lilypond.org/doc/v2.25/Documentation/notation/default-values-for-outside_002dstaff_002dpriority.fr.html)), donc en cas de collision il se placera au-dessus.

Ajouter un `  \tweak outside-staff-priority #1600` dans le timeMark juste avant la commande `\textMark`.
Attention dans le code proposé par Martial il y a `\override RehearsalMark.padding` dans le bloc `\layout` qui court-circuite `outside-staff-priority`. Je remplacerais ces `padding` par `outside-staff-padding` (et une autre valeur).

Cordialement,
Xavier

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/timline-pour-musique-de-film/5696/13).

---

From: MartialR via LilyPond <[email-masked]>
Date: Fri, 03 May 2024 21:59:41 +0000

ha je n'avais pas été au-dessus de 1000
je testerai demain 
bonne nuit

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/timline-pour-musique-de-film/5696/14).

---

From: MartialR via LilyPond <[email-masked]>
Date: Sat, 04 May 2024 10:03:05 +0000

Bonjour,
obtiens ceci maintenant. 
Tout est aligné verticalement. 

```
\version "2.24"
%la fonction pour afficher le temps d'après Jean

\layout {
  \context {
    \Score

timeMark =  {
  \tweak outside-staff-priority #1600
  \tweak X-offset #-1.5
  \tweak Y-offset #12
  \tweak details.time-mark ##t \tweak color "red"
  \textMark
  "Abracadabra" \mark \default
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\header {  }
\paper {
  top-margin = 20
  indent =  20
}
%mise en forme générale
\layout {
  \context {
    \Score
    \override MetronomeMark.padding = #17
    \override RehearsalMark.padding =#8
    \override RehearsalMark.outside-staff-padding = #2
    \override StaffGrouper.staff-staff-spacing.padding = 0
    \override StaffGrouper.staff-staff-spacing.basic-distance = 10
  }

  \context {
    \Voice
    \override StaffGrouper.
    staffgroup-staff-spacing.basic-distance = #0
  }
  \context {
    \Lyrics
    \override LyricText.outside-staff-padding = #100
  }
}

% le format
rhytMicForme = {
  \clef percussion
  %\hide NoteHead
  \override NoteHead.style = #'cross
  \override NoteHead.no-ledgers = ##t
  \override StaffSymbol.line-count = #1
  \numericTimeSignature
  \stemDown
}

Flute = \relative {
  R1 R1 R1 R1
  R2.
  R1 R1 R1
}

structure = {
  \set Score.rehearsalMarkFormatter = #format-mark-circle-numbers
  %\override Score.RehearsalMark.padding =#0
  \tempo 4=72
  r1 \timeMark
  \bar"||"
  r1 \timeMark
  r1 \timeMark
  % \tempo 4=120
  r1  \timeMark
  \time 3/4
  R2. \timeMark
  \tempo 4 = 180
  \time 4/4
  r1 \timeMark
  r1 \timeMark
}

rythmBarre =\relative {
  \rhytMicForme
  \time 4/4
  \tweak Y-offset #13 \tweak color "red" \textMark "0.0"
  c4 c c c
  \repeat unfold 2 {  c4  c c c  }
  c c  c
  \repeat unfold 4 {  c4  c c c  }
}

descriptionText = {

\score {
  \new StaffGroup \with {
    \override StaffGrouper
    .staffgroup-staff-spacing
    .basic-distance = 30
  } <<
    \new RhythmicStaff
  \layout { }
}

```

Cordialement

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/timline-pour-musique-de-film/5696/15).

---

From: Olivier Charade via LilyPond <[email-masked]>
Date: Sat, 04 May 2024 11:43:56 +0000

Ah oui, c'est pas mal.
Pour compléter, la fonction de calcul du time code en commençant par l'heure:
```
 (define (format-time seconds)
     (let* ((heures (euclidean-quotient seconds 3600))
            (resta (euclidean-remainder seconds 3600))
            (minutes (euclidean-quotient resta 60))
            (restb (euclidean-remainder resta 60))
            (seconds (euclidean-quotient restb 1))
            (restc (euclidean-remainder restb 1)))
       (string-append (format #f "~2,'0d:" heures)
                      (format #f "~2,'0d:" minutes)
                       (format #f "~2,'0d.~2,'0d" seconds (round (* restc 24))))))
```
Il ne reste plus qu'à trouver comment forcer la valeur du temps écoulé (et pour moi à trouver la source de l'erreur mentionnée dans le fil d'après et qui m'empêche actuellement de voir quoi que ce soit).

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/timline-pour-musique-de-film/5696/16).

---

From: Olivier Charade via LilyPond <[email-masked]>
Date: Sat, 04 May 2024 20:28:11 +0000

Comme j'en suis à programmer en Scheme sans complètement comprendre ce que je  fais, je sollicite un peu d'aide.
J'initialise mon décalage dans ma variable de synchro:

```
synchro_A = \drummode {
  #(define time-origin 1)
  s1 % décompte
  %%%%%%%%%%%%%
  \timeMark
  cab4^\markup\bold\column{ \box "Underwater Scene"  \normal-text "X" }
    4 4 4
  \repeat unfold 2 {cab4 4 4 4}
  \timeMark
```
Normalement, la valeur que je voulais mettre était 3606, mais comme j'obtenais n'importe quoi, j'ai mis 1 pour essayer de comprendre le calcul.

J'ai modifié la fonction de Jean sur une seule ligne (de toutes façons, quand j'ai essayé de le faire ailleurs ça plantait):

```
(set! total-time
               (+ total-time time-origin (* 60 (/ time-delta wholes-per-minute))))
```
Je croyais juste ajouter mon décalage, ici 1.
Or,  en fin de première mesure au lieu d'être à 2 +1, soit 3, je suis à 4, et trois mesures plus loin, au lieu d'être à 8 +1, soit 9, je suis à 22, comme si chacune des mesures valait 6.
En gros j'ai une progression géométrique là où je croyais avoir une progression arithmétique.
Si quelqu'un comprend ce que j'ai écrit...

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/timline-pour-musique-de-film/5696/17).

---

From: Gilles via LilyPond <[email-masked]>
Date: Sat, 04 May 2024 21:08:44 +0000

[quote="olicha, post:17, topic:5696"]
` #(define time-origin 1)`
[/quote]

Je pense qu'il faut définir un Timecode start, et tant qu'à faire des images pas seconde aussi...
Malheureusement je ne sais comment régler le Timecode start à l'image prêt, ça fonctionne à la seconde prêt seulement... 
Et pareil pour les images par seconde, il arrive pourtant qu'il y ait des formats du type 29,76 ips...

\version "2.24"
                       (format #f "~2,'0d.~2,'0d" seconds (round (* restc ips))))))
         (total-time timecode-start)

#(define ips 24)
#(define timecode-start 10)

\layout {
  \context {
    \Score

timeMark =  {

  \context {
    \Voice
    \override StaffGrouper.

% le format
rhytMicForme = {
  \clef percussion
  %\hide NoteHead

Flute = \relative {
  R1 R1 R1 R1
  R2.
  R1 R1 R1
}

structure = {

rythmBarre =\relative {
  \rhytMicForme
  \time 4/4
  \tweak self-alignment-X #CENTER \tweak color "red" \textMark ""
  c4 c c c
  \repeat unfold 2 {  c4  c c c  }
  c c  c
  \repeat unfold 4 {  c4  c c c  }
}

descriptionText = {

\score {
  \new StaffGroup \with {
    \override StaffGrouper
  \layout { }
}

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/timline-pour-musique-de-film/5696/18).

---

From: Olivier Charade via LilyPond <[email-masked]>
Date: Sun, 05 May 2024 08:32:20 +0000

Super! Ca marche.
Pas sûr de tout comprendre mais ça fait le travail.
Et dans ma courte expérience je n'ai jamais vu un monteur s'amuser à faire démarrer des morceaux de films en dehors de la seconde pile. Le décompte d'image, ça vient après.

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/timline-pour-musique-de-film/5696/19).

---

From: Olivier Charade via LilyPond <[email-masked]>
Date: Sun, 05 May 2024 13:22:36 +0000

Question, car je suis loin de comprendre tout ce qui se passe dans la fonction de Jean.
Est-ce qu'il y a un suivi continu du temps écoulé en interne à Lilypond ou dois-je penser à mettre un \timeMark à chaque changement de tempo pour que celui-ci soit pris en compte?

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/timline-pour-musique-de-film/5696/20).

---

From: Jean Abou Samra via LilyPond <[email-masked]>
Date: Mon, 06 May 2024 23:49:09 +0000

Pour forcer le "time code" à un moment donné, on peut faire ce genre de choses :

```
\version "2.24"

ips = 24

#(set-object-property! 'forcedTimeCode 'translation-type? rational?)

forceTimeCode =
#(define-music-function (hours minutes seconds frame) (integer? integer? integer? integer?)
   #{ \once \set Score.forcedTimeCode = #(+ (* 3600 hours) (* 60 minutes) seconds (/ frame ips)) #})

       (format #f "~2,'0d:~2,'0d:~2,'0d.~2,'0d" heures minutes seconds (round (* restc ips)))))
                      ly:moment-main))
              (forced-time-code (ly:context-property context 'forcedTimeCode #f)))
               (or forced-time-code (+ total-time (* 60 (/ time-delta wholes-per-minute)))))

\layout {
  \context {
    \Score

timeMark =  {

  \context {
    \Voice
    \override StaffGrouper.

% le format
rhytMicForme = {
  \clef percussion
  %\hide NoteHead

Flute = \relative {
  R1 R1 R1 R1
  R2.
  R1 R1 R1
}

structure = {
  \forceTimeCode 0 0 2 0
  \timeMark
  r1 \timeMark
  \bar"||"
  r1 \timeMark
  r1 \timeMark
  % \tempo 4=120
  r1  \timeMark
  \time 3/4
  R2.
  \forceTimeCode 0 0 30 2
  \timeMark
  \tempo 4 = 180
  \time 4/4
  r1 \timeMark
  r1 \timeMark
}

rythmBarre =\relative {
  \rhytMicForme
  \time 4/4

descriptionText = {

\score {
  \new StaffGroup \with {
    \override StaffGrouper
  \layout { }
}
```

[quote="olicha, post:20, topic:5696"]
Est-ce qu'il y a un suivi continu du temps écoulé en interne à Lilypond ou dois-je penser à mettre un \timeMark à chaque changement de tempo pour que celui-ci soit pris en compte?
[/quote]

Normalement, ça devrait marcher sans.

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/timline-pour-musique-de-film/5696/21).

---

From: Gilles via LilyPond <[email-masked]>
Date: Tue, 07 May 2024 10:16:09 +0000

Super bravo Jean !
N'y aurait-il pas moyen de rendre la fonction automatique, avec les BarNumbers?
Parce que du coup, on pourrait en profiter pour rattraper le timecode perdu lors d'une repeat volta par exemple.
Pour l'instant s'il y a un repeat volta ça ne prend pas en compte le temps de la répétition, et il me semble que BarNumber est capable de calculer le nombre de mesures répétées.
Gilles

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/timline-pour-musique-de-film/5696/22).

---

From: Olivier Charade via LilyPond <[email-masked]>
Date: Mon, 13 May 2024 10:56:00 +0000

J'ai enfin pu tester la dernière version de Jean. Impeccable.

Que gagne-t-on à séparer la voix du clic de celle des descriptions textuelles? Pour l'instant j'ai gardé les deux dans la même pour réduire les risques d'oublier quelque part l'existence d'un changement de mesure effectué par la voix de structure.

Et pour ma gouverne, pourquoi Lilypond m'avertit-il de multiples fois d'un bouclage de canal MIDI et d'une réaffectation modulo 16 (je demande parce que je suppose que c'est lié à cette time line; je peux me tromper) ?

---
Pour poster dans ce sujet, visitez la [page du sujet](https://lilypond.community/t/timline-pour-musique-de-film/5696/23).