JW Lua: Copier/Coller Entre Portées

Questions & réponses concernant les scripts JW Lua et les Finalescripts
chris
Modérateur
Messages : 1236
Inscrit le : 28 novembre 2012 à 08:01
Version(s) de Finale  : v25 et 2014.5 anglais
OS, RAM  : PC - Windows 10
Homme/Femme  : H
Localisation : Région nantaise

Re: JW Lua: Copier/Coller Entre Portées

Message par chris »

Si cela peut vous aider, j'ai retrouvé un script (je ne me rappelle plus de l'auteur) qui permet de copier un layer. Celui-ci copie le layer 1 sur le layer 2. Mais il y a moyen de copier sur une autre portée (attention aux index des portées, la 1ère portée n'a pas obligatoirement l'index 1, et le 1er layer a l'index 0).

Code : Tout sélectionner

local function copyLayer(layerSource,layerDest,idStaff,firstMeasure,lastMeasure)
	local entrylayer = finale.FCNoteEntryLayer(layerSource, idStaff, firstMeasure, lastMeasure)
	entrylayer:Load()
	local entrylayerDest = entrylayer:CreateCloneEntries(layerDest, idStaff, firstMeasure)
	entrylayerDest:Save()
	entrylayerDest:CloneTuplets(entrylayer)
	entrylayerDest:Save()
end

copyLayer(0,1,1,1,2)
Chris
Martin Marris
Messages : 6
Inscrit le : 3 décembre 2020 à 05:48
Version(s) de Finale  : 26 anglais
OS, RAM  : Windows 10
Homme/Femme  : H
Localisation : Sud de l'Angleterre.

Re: JW Lua: Copier/Coller Entre Portées

Message par Martin Marris »

En fin de compte, c'est relativement facile.

Il faut utiliser FCMusicRegion() et non pas finenv.Region(). Ceci permet de sélectionnner une région à l'intérieur du script, sans "sélection" humaine.

Attention, il faut que les numéros index de mesures, et de portées, soient valides. Sinon le script se plante de manière spectaculaire.

Quand on copie la musique d'une portée à une autre, ça marche très bien sauf que la clé de la portée d'origine est copiée sur la portée de "destination". Donc il faut changer la clé (le cas échéant), après le copier/coller.

Un exemple:

Code : Tout sélectionner

local sel_region = finenv.Region()

local musicregion = finale.FCMusicRegion()

--copier la musique de la source (Flûte)
musicregion:SetStartStaff(1)
musicregion:SetEndStaff(1)
musicregion:SetStartMeasure(1)
musicregion:SetEndMeasure(20)
musicregion:CopyMusic()

--définir la destination (Basson)
musicregion:SetStartStaff(3)
musicregion:SetEndStaff(3)
musicregion:SetStartMeasure(1)
musicregion:SetEndMeasure(20)
--définir la clé de l'instrument "destination" (Basson)
local cell = finale.FCCell(1, 3)
local clefIndex = cell:CalcClefIndexAt(0)

--coller la musique sur la destination
musicregion:PasteMusic()

--changer la clé
local cells = finale.FCCells()
cells:ApplyRegion(musicregion)
for cell in each(cells) do
    local cellFrameHold = finale.FCCellFrameHold()
    cellFrameHold:ConnectCell(cell)
    if cellFrameHold:Load() then
        cellFrameHold.ClefIndex = clefIndex
        cellFrameHold:Save()
    end
end

--"release" la musique
musicregion:ReleaseMusic()

--éliminer la sélection bleutée
sel_region:SetInDocument()
Martin
Verrouillé