[PYTHON] Présentation du script AE qui peut rendre un peu plus facile la correspondance sonore dans C4D

Ceci est l'article du 5ème jour du Calendrier de l'Avent After Effects 2016. L'article d'hier était de @tetsuoh j'ai essayé d'utiliser ErgoDox pour le tournage d'anime.

introduction

Je fais une vidéo. C'est Shuto. ** Cinema 4D ** (communément appelé C4D), qui est souvent utilisé dans la production d'œuvres d'animation graphique telles que BGA et Vocaloid MV, est un logiciel de production 3DCG développé par MAXON, dont le siège est en Allemagne. Beaucoup d'entre vous connaissent peut-être le nom du récent After Effects CC car il possède une fonction telle que «Cineware» et vous pouvez utiliser «Cinema 4D Lite» sans acheter un produit autonome C4D.

Maintenant, entrons dans le sujet principal, mais cette fois, je vais introduire un script qui rend ** la correspondance sonore ** un peu plus facile lors de la création d'une scène CG qui correspond à la musique en utilisant C4D. ..

Comme beaucoup d'entre vous l'ont peut-être remarqué, cet article est destiné aux utilisateurs de C4D et AE. Je suis désolé si vous n'êtes pas un utilisateur de C4D. Veuillez me pardonner car il s'agit d'un script AE Anything ry </ del>

À propos, c'est l'environnement, mais celui-ci utilise CS6 (11.0.4.2) de Windows 10.

Problèmes de correspondance sonore dans C4D

Dans C4D, lorsque la scène devient lourde, l'aperçu de l'écran de travail ne peut pas être lu. La lecture audio peut être saccadée ou la fréquence d'images de l'aperçu peut être inférieure ou égale à 1 ips. Si vous êtes un utilisateur AE, vous pourriez penser: "Alors c'est un aperçu de la RAM!", Mais C4D n'a pas d'aperçu de la RAM. Au lieu de cela, l'aperçu qui est simplement rendu puis lu est «l'aperçu matériel (logiciel)» de «création d'aperçu», mais lorsque la scène devient compliquée, cette «création d'aperçu» est également très lourde. Cela devient souvent. qiita_advent2016_1_1.png

qiita_advent2016_1_2.png

Fondamentalement, dans l'appariement sonore de la production vidéo, vous passerez par de nombreux essais et erreurs pour trouver un mouvement qui s'adapte confortablement. Cependant, si vous faites cette lourde "création d'aperçu" plusieurs fois, vous serez épuisé par essais et erreurs. Afin de produire efficacement, il est important de savoir à quel point le timing idéal de compression du son peut être atteint en créant un seul aperçu.

Solution et procédure

Il est difficile de deviner le timing si vous faites soudainement correspondre le son avec C4D depuis le début. AE a une fonction pour exporter un fichier .c4d, alors faisons-en bon usage et apportons la ** marque de correspondance sonore ** créée par AE vers C4D. La procédure est comme ça. ** Tous les 1 à 4 sont des travaux AE. ** ** Le script dans le titre sera décrit à la fin.

1. Lisez le fichier de musique sur le côté AE et vérifiez la synchronisation à l'aide de l'aperçu de la RAM

Normalement, laissez AE lire un fichier mp3 ou musical et faire un aperçu de la RAM. Vérifiez le timing dans une certaine mesure ici.

2. Réglez ** marqueur AE ** à la synchronisation sonore caractéristique qui est le point clé de la compression du son

qiita_advent2016_1_3.png De cette façon, vous pouvez placer des marqueurs sur les couches de fichiers musicaux. Par exemple, si vous voulez faire un mouvement aussi fin en 2 secondes, il est difficile de faire correspondre le son avec C4D.

3. Créez un calque de lumière et image-clé les coordonnées etc. au même moment que le marqueur installé dans 2.

qiita_advent2016_1_5.png Convertit le marqueur atteint en 2 en une image clé de la propriété position du calque de lumière. Vous pouvez le faire à la main, mais c'est difficile, alors ** automatisez-le avec un script **. La "couche lumineuse" peut être la "couche caméra". Tout fonctionnera tant que vous aurez des images clés dans C4D.

4. Exportez la composition au format «.c4d»

qiita_advent2016_1_6.png Vous pouvez apporter la lumière AE à C4D, y compris les informations des images clés frappées. Automatisons également cela avec un script ** Vous pouvez également exporter manuellement à partir du menu ** "Fichier> Exporter> Exportateur CINEMA 4D" **. Cependant, une chose à noter est que la ** méthode de complétion d'image clé pour frapper la couche de lumière de 3 est "Stop" **. Vous pouvez exporter avec d'autres méthodes de complément, mais toute méthode de complément qui ne prend pas en charge C4D semble être cuite sans autorisation, et vous ne saurez pas où se trouve la synchronisation du marqueur. (Figure exportée par méthode d'interpolation linéaire) qiita_advent2016_1_7.png

5. Lisez le fichier exporté .c4d dans C4D et émettez un son en vous référant à la synchronisation des images clés de la couche de lumière.

Si vous définissez la méthode de complétion des images clés sur "stop" et que vous l'exportez en tant que fichier .c4d, vous pouvez apporter la lumière avec les images clés frappées uniquement au moment voulu comme celui-ci lors de la lecture avec C4D. qiita_advent2016_1_8.png Bien sûr, en production, il est nécessaire de créer plusieurs fois un aperçu matériel (logiciel) pour vérifier que le mouvement et le timing sont bien adaptés, mais en utilisant cette méthode pour apporter la marque du son, il est généralement nécessaire. Vous pouvez continuer à avancer dans un état où le moment est venu.

En aparté, je l'ai également utilisé dans le BGA de CO5M1C R4ILR0AD par kanone que j'ai récemment produit. qiita_advent2016_1_13.PNG

À propos du script

Enfin, je présenterai le script, mais de cette manière ** "Sur la base des informations de marqueur créées par AE, créez une image clé de la couche de lumière qui peut être prise en C4D et exportez-la vers le fichier C4D" ** C'était. Je ne pouvais pas penser à une bonne procédure pour expliquer quel type de script j'ai écrit et pourquoi j'ai écrit un tel script, alors je l'ai écrit de manière détournée. Il semble qu'il ait été implémenté récemment, mais comme il n'y avait pas de méthode pour accéder au marqueur de composant, le [Script pour obtenir le marqueur de composition] de noriaki iwatani (http://nariakiiwatani.net/?p= 351) est loué.

Le script créé ci-dessous. Enregistrer une copie est un problème, alors enregistrez ici avec Ctrl + S ou ⌘ + S. ** Assurez-vous que le format de sauvegarde est .jsx. ** **

markerToC4DasLight.js



//Lorsqu'il est utilisé avec un composant ou un calque sélectionné, un nouveau calque de lumière est créé et défini avec des images clés en même temps que le composant ou le marqueur de calque.
//Si un calque est sélectionné, utilisez le marqueur de ce calque.
//Si le composant est sélectionné(Si aucun calque n'est sélectionné), Utilisez le marqueur de composant.
//Comme CS6 n'a pas de méthode pour obtenir le marqueur du composant, j'ai emprunté le script de nariakiwatani tel quel.


var activeComp = app.project.activeItem;  //Obtenir l'élément actif dans le panneau de projet

function main() {
    var markers = null;
    
    
    if (activeComp instanceof CompItem == false) {  //Repousse les éléments actifs autres que les composants
        alert("Aucun composant n'est sélectionné.");
        return;
    }
    if (activeComp.selectedLayers.length > 1) {  //Repousse si deux couches ou plus sont sélectionnées dans activeComp
        alert ("Sélectionnez une seule couche ou uniquement des composants.\Si n couches ne sont pas sélectionnées, le marqueur de composant actif sera utilisé.");
        return;
    } else if (activeComp.selectedLayers.length == 1) {  //S'il n'y a qu'un seul calque sélectionné, obtenez le marqueur pour ce calque
        markers = activeComp.selectedLayers[0].property("Marker");
    } else if (activeComp.selectedLayers.length == 0) {  //Obtenez des marqueurs pour ce composant si aucun calque n'est sélectionné
        markers = getCompMarker(activeComp);
    }
    if (markers.numKeys < 1) {  //Repousser si le marqueur est 0
        alert ("Il n'y a pas de marqueurs sur le calque ou le composant sélectionné.");
        return;
    }


    var newLight = activeComp.layers.addLight("Marker_Light", [0, 0]);  //Générez une couche de lumière et stockez-la dans newLight
    newLight.property("position").setValue([0, 0, 0]);  //Si les coordonnées de la couche de lumière sont initiales, ce sera dégoûtant, alors changez-le
    newLight.property("pointOfInterest").setValue([0, 0, 100]);
    for (var i=0; i<=markers.numKeys; i++) {  //Hit des images clés pour les marqueurs acquis
        var keyIdx = newLight.property("position").addKey((i==0)?0:markers.keyTime(i));  //Frappez une image clé et stockez l'index de cette image clé dans keyIdx
        newLight.property("position").setValueAtKey(keyIdx, [0, 0, i*-10]);  //Modifier la valeur de coordonnées de la clé en fonction de l'index stocké
        //Changez la méthode d'interpolation de la même manière
        newLight.property("position").setInterpolationTypeAtKey(keyIdx, KeyframeInterpolationType.HOLD, KeyframeInterpolationType.HOLD);
    }


    var version = parseInt(app.version.split(".")[0]);
    var msg_export = "Marker_Lumière générée.\n continuer.Voulez-vous exporter vers un fichier c4d?";
    var code_export = (version>11)?5022:5006;
    var execute = confirm(msg_export);  //Afficher la boîte de dialogue de confirmation
    if (execute) app.executeCommand(code_export);  //Si oui, démarrez l'exportateur
    
}

app.beginUndoGroup("markerToC4DasLight");  //d'ici
main();
app.endUndoGroup(); //Le traitement jusqu'à ce point peut être retourné avec une annulation


/*
Script pour obtenir des marqueurs de composition dans After Effects
2013.10.31 by nariakiiwatani
MIT License - http://sourceforge.jp/projects/opensource/wiki/licenses%2FMIT_license
*/
 
//Transmettez la composition pour laquelle vous souhaitez obtenir des informations de marqueur
function getCompMarker(comp) {
 
//Obtenez une liste des compositions incluses dans le projet
function getCompAll(proj) {
    var ret = [];
    for(var i = 1; i <= proj.numItems; ++i) {
        if(proj.item(i) instanceof CompItem) {
            ret.push(proj.item(i));
        }
    }
    return ret;
}
//Obtenir les différences de tableau
function getArrayDiff(a, b) {
    var ret = [];
    for(var _a in a) {
        var found = false;
        for(var _b in b) {
            if(a[_a] === b[_b]) {
                found = true;
                break;
            }
        }
        if(!found) {
            ret.push(a[_a]);
        }
    }
    var tmp = a;
    a = b;
    b = tmp;
    for(var _a in a) {
        var found = false;
        for(var _b in b) {
            if(a[_a] === b[_b]) {
                found = true;
                break;
            }
        }
        if(!found) {
            ret.push(a[_a]);
        }
    }
    return ret;
}
 
//Puisque les informations de sélection de la fenêtre de projet sont utilisées, enregistrez l'état avant l'opération.
var selected = app.project.selection;
var selection = [];
for(var i = 0; i < selected.length; ++i) {
    selection.push(selected[i].selected);
    selected[i].selected = false;
}
 
//Le corps principal du traitement d'ici
comp.selected = true;   //Sélectionnez la composition à exporter
//"Nouvelle composition à partir de plusieurs éléments" ne peut pas être utilisé à moins que la fenêtre du projet ne soit focalisée, alors activez-la de force.
app.project.showWindow(false);
app.project.showWindow(true);
 
var allComps = getCompAll(app.project); //Liste des compositions avant l'exécution de la commande
app.executeCommand(2796);   //Exécuter "Nouvelle composition à partir de plusieurs éléments"
var added = getArrayDiff(getCompAll(app.project), allComps)[0]; //Trouvez la composition ajoutée en exécutant la commande
var marker = added.layer(1).marker; //C'est le marqueur que je voulais!
 
//Nettoyez d'ici
added.remove(); //Supprimer la composition accrue
comp.selected = false;  //Désélectionner
for(var i = 0; i < selected.length; ++i) {   //Revenir à l'état sélectionné avant d'exécuter le script
    selected[i].selected = selection[i];
}
//Renvoie les informations du marqueur
return marker;
}

Script bonus C4D

En ce qui concerne la méthode de lecture de musique avec C4D, comme vous pouvez le voir si vous le recherchez sur Google, vous pouvez ajouter une piste spéciale appelée ** "son" ** à l'objet (null etc.), mais cela provient également de l'interface utilisateur En raison d'une mauvaise accessibilité, chaque fois que vous modifiez le paramètre "Son", vous devez ouvrir la chronologie, sélectionner la piste "Son" et l'afficher dans le gestionnaire d'attributs.

qiita_advent2016_1_14.PNG ↑ Vous devez sélectionner et activer la piste spéciale ajoutée "Son" ↓ Cette propriété ne peut pas être affichée qiita_advent2016_1_11.PNG

D'autres paramètres tels que les coordonnées et autres balises sont ** essentiellement affichés dans le gestionnaire d'attributs si vous sélectionnez l'objet ou la balise elle-même dans le gestionnaire d'objets (arborescence) **, mais pour afficher les attributs de "son" Doit ** sélectionner "Son" dans la chronologie **. qiita_advent2016_1_10.PNG ↑ Même si vous sélectionnez l'objet "nul" dans le gestionnaire d'objets, la propriété "son" n'est pas affichée.

Donc, si vous ajoutez une piste "son" à un nouvel objet nul (nommé ** Music **) (en fait cette procédure est assez fastidieuse) et que vous sélectionnez ensuite cet objet Music, vous pouvez facilement ajouter les propriétés "son" comme celle-ci J'ai écrit un script qui peut accéder. qiita_advent2016_1_12.PNG Comme mécanisme, j'utilise toujours la balise Python pour regarder la valeur de l'onglet "Son" du gestionnaire d'attributs ↑ et la mettre dans la valeur de la piste spéciale de "Son". En d'autres termes, si vous modifiez les valeurs de "Use Sound" et "Start Time" dans ↑, cela sera automatiquement reflété dans la piste spéciale.

** * Veuillez faire attention à son utilisation! Assurez-vous de l'enregistrer en tant que fichier de script sans le copier dans la balise de script Python et exécutez-le à partir de "Script> Script utilisateur> Exécuter le script" dans le menu. </ font> ** qiita_advent2016_1_15.png

Comme pour le script AE, enregistrez le script depuis ici. ** Assurez-vous que le format de sauvegarde est .py ainsi que jsx. ** **

addMusic.py


import c4d
import time

def main():
    obj = c4d.BaseObject(c4d.Onull)
    obj.SetName("Music")
    doc.InsertObject(obj)
    doc.SetSelection(obj)

    tr = c4d.CTrack(obj,c4d.DescID(c4d.DescLevel(c4d.CTsound, c4d.CTsound, 0)))
    obj.InsertTrackSorted(tr)

    pyTag = obj.MakeTag(c4d.Tpython)
    pyTag.SetName("Music")

    rootGroup = c4d.GetCustomDataTypeDefault(c4d.DTYPE_GROUP)
    rootGroup[c4d.DESC_NAME] = "Sound Properties"
    rootGroup[c4d.DESC_SHORT_NAME] = "Sound"
    rootGroup[c4d.DESC_TITLEBAR] = 1
    rootGroup[c4d.DESC_GUIOPEN] = 1
    rootGroup[c4d.DESC_PARENTGROUP] = c4d.DescID()
    descId = obj.AddUserData(rootGroup)

    secondGroup = c4d.GetCustomDataTypeDefault(c4d.DTYPE_GROUP)
    secondGroup[c4d.DESC_NAME] = "Basic Properties"
    secondGroup[c4d.DESC_SHORT_NAME] = "Basic"
    secondGroup[c4d.DESC_TITLEBAR] = 1
    secondGroup[c4d.DESC_GUIOPEN] = 1
    secondGroup[c4d.DESC_PARENTGROUP] = descId
    descId = obj.AddUserData(secondGroup)

    label = ["Use Sound", "Start Time", "Sound"]
    default = [1, c4d.BaseTime(), ""]
    typ = [c4d.DTYPE_BOOL, c4d.DTYPE_TIME, c4d.DTYPE_FILENAME]

    for i in range(3):
        bc = c4d.GetCustomDataTypeDefault(typ[i])
        bc[c4d.DESC_NAME] = label[i]
        bc[c4d.DESC_SHORT_NAME] = label[i]
        bc[c4d.DESC_PARENTGROUP] = descId
        bc[c4d.DESC_DEFAULT] = default[i]
        bc[c4d.DESC_ANIMATE] = c4d.DESC_ANIMATE_OFF
        descId2 = obj.AddUserData(bc)
        obj[descId2] = default[i]

    pyTag[c4d.TPYTHON_CODE] = 'import c4d\n#Welcome to the world of Python\n\n\ndef main():\n    obj = op.GetObject()\n    tr = obj.GetCTracks()[0]\n    tr[c4d.CID_SOUND_ONOFF] = obj[(c4d.ID_USERDATA, 3)]\n    tr[c4d.CID_SOUND_START] = obj[(c4d.ID_USERDATA, 4)]\n    tr[c4d.CID_SOUND_NAME] = obj[(c4d.ID_USERDATA, 5)]\n'

if __name__=='__main__':
    main()
    c4d.EventAdd()

    • Ajouté immédiatement après la publication * Yarita-san Selon l'interface utilisateur standard C4D, accéder à la propriété "Sound" est aussi simple que d'ajouter "Sound Effector" de MoGraph à la scène. Il semble que cela puisse être fait. Cependant, comme "Sound Effector" ** ne lit pas le son dans "Preview Creation" tel que l'aperçu matériel **, il semble qu'il sera nécessaire de l'utiliser correctement. Si vous ne créez pas d'aperçu, cela seul sera assez facile, mais si vous créez toujours un aperçu comme moi, je pense qu'un tel script est utile.
  • Ajout jusqu'à ici *

finalement

À ce stade, il est déjà passé 0:15, qui devrait être publié. Pardon. Je l'ai écrit à la hâte, donc je pense que c'était très difficile à lire, mais s'il y a des erreurs ou des points confus, veuillez me contacter dans les commentaires ou Twitter!

    • Ajouté immédiatement après la publication * De plus, après la publication de l'article, M. J'ai fait ** comment alléger la scène C4D en premier lieu **. Par conséquent, je pense que cette page sera utile, donc je pense que vous devriez également lire ceci.
  • Ajout jusqu'à ici *

Alors demain, ce sont les [Conseils pour l'homme qui n'autorise pas les noms de dossiers multi-octets] de @ kickbase (http://www.kickbase.net/entry/after-effects-exclude-multi-byte)! Je suis aussi un homme qui n'autorise pas les noms de dossiers multi-octets, donc j'ai vraiment hâte! * * Mise à jour le 6 décembre 2016 ↑ Lien ajouté *

Recommended Posts

Présentation du script AE qui peut rendre un peu plus facile la correspondance sonore dans C4D
Rendre la compilation C un peu plus facile
Facilitons un peu la gestion des dépendances avec pip