Mix Notes does away with using notebooks in the dark, or brightly-lit laptops with noisy typing during your sound mix reviews. This customisable note taking app will give you timecode-stamped notes for your most commonly-encountered issues.
This app is still under development, so feedback and suggestions welcome.
How it works:
Tap the timecode display to enter your film's start timecode and press play at the same time to synchronise. If you are a bit out, simply use the +1s and -1s buttons to nudge closer into sync. You can type a new timecode in whilst it is playing too.
The home page buttons are mostly to do with the category of note, which take you to the actual note on a second page. For example [Dial]-[Sync] or [Music]-[Louder] or [VO]-[Later]. For more specific notes, use [Custom] to enter text. The timestamp is captured on the first button press.
Also on the first page are special function buttons:
[Picture] - Takes you to a third page of common picture faults, which are often picked up on in a mix review.
[Loudness] and [Peak] - Use these handy number pickers to save loudness and peak values.
[Client] - This was a requested feature to differentiate between a client-requested note and one of your own. This toggle button adds "Client: " as a prefix to your note - you can change this prefix to whatever you like.
Most buttons can be customised, by long-pressing, to modify the text or colour. There is also an option to enable or disable the secondary notes page. There are four 'User' buttons ready for customisation.
Finding it all a bit complicated with too many buttons? Try the 9 button 'Simplified View'! You can save and recall presets for this page to customise the layout for different jobs.
Creating and Naming Notes:
When you make your first note, a list is automatically created for you with a default name of the date and time. You can edit this name, either by using the edit icon, or by swiping right in the All Notes List page. You can create named lists in advance, using the menu.
Viewing Notes:
Tap on the list icon to view your current notes. They appear in the order they were created, but you can drag to re-order. Tapping the note marks it as completed. Swipe left to delete a note and right to edit the text.
All Notes List:
In the expanded menu, tap All Notes List to view all of your lists. Tap on one to open. Swipe left to delete a list and right to edit the name. Long press to select multiple lists to delete, or use the menu option to clear the whole database.
Exporting Notes:
With a list open, you can select export in the expanded menu and the notes will be copied to your clipboard. The email option also sends a CSV file, which you can use to generate Pro Tools markers using third-party tools such as SoundFlow or EDIMarker. There is a SoundFlow script for this below!
Timecode Sync:
Using the SoundFlow script below, you can now synchronise your Pro Tools timecode with the app! I am currently investigating alternative ways of doing this, for users who do not have a SoundFlow subscription...
Mix Notes v.1.1.1 has introduced Pro Tools Timecode Sync with SoundFlow!
You'll need an active SoundFlow subscription and a running script to send the Pro Tools timecode to the server.
Here is the script that you will need to run:
Mix Notes Send Timecode to Server.
----
// Enable sendTimecode() looping
globalState.sendTimecodeToServer = true
// Variables
let userID = sf.soundflow.getUserInfo().userUid;
let postInterval = 250 // Post frequency in milliseconds
var currentTimecode = "00:00:00:00"
var previousTimecode = currentTimecode
var isPlaying = false
var playStatus = "stopped"
// Server URLs
const postURL = `https://mixnotesgooglecloudrun-156396018729.europe-west1.run.app/data`
const getURL = `https://mixnotesgooglecloudrun-156396018729.europe-west1.run.app/data?UserID=${userID}`
log("Sending Timecode to Server", "UserID: " + userID);
// Run continuous background loop
runForever("sendTimecode", sendTimecode, postInterval, 5000);
function sendTimecode() {
// Only run when enabled
if (globalState.sendTimecodeToServer == true) {
// Read Pro Tools Timecode
readTimecode();
// Get Play Status from Pro Tools
getPlaySatus();
if (isPlaying) {
playStatus = "playing";
sendHTTP();
} else {
playStatus = "stopped"
//update only when the timecode changes
if (previousTimecode != currentTimecode) {
previousTimecode = currentTimecode;
sendHTTP();
}
}
}
}
function readTimecode() {
try {
currentTimecode = sf.ui.proTools.mainWindow.counterDisplay.mainCounter.value.invalidate().value;
} catch (err) {
log("Timecode Error", "Couldn't read Pro Tools Timecode, stopping script");
sf.soundflow.stopAll()
}
}
function getPlaySatus() {
try {
// Only when main window is focussed
if (sf.ui.proTools.isMainOrMixOrPluginOrOtherWindowFocused) {
isPlaying = sf.ui.proTools.isPlaying;
}
} catch (err) {
log("Play Status Error", "Couldn't get Pro Tools play status");
}
}
function sendHTTP() {
try {
sf.net.httpRequest({
url: postURL,
method: 'POST',
data: {
"UserID": userID,
"Timecode": currentTimecode,
"PlayStatus": playStatus
}
});
} catch (err) {
log("Error sending timecode to server");
sf.wait({ intervalMs: 1000 })
}
}
function runForever(name, action, interval, timeout) {
var now = (new Date).valueOf();
globalState[name] = now;
sf.engine.runInBackground(function () {
try {
while (true) {
sf.engine.checkForCancellation();
globalState[name] = (new Date).valueOf();
action();
sf.wait({ intervalMs: interval, executionMode: 'Background' });
}
} finally {
globalState[name] = null;
}
});
}
----
If you want a to stop sending timecode (and save me some server costs), you can either tell SoundFlow to 'Stop All Running Scripts', which will kill all the background loops. Or, you can simply send this command via another script:
Mix Notes Stop Sending Timecode.
----
// Disable sendTimecode() looping
globalState.sendTimecodeToServer = false
----
v.1.1.0 introduced Pro Tools Marker Creation with SoundFlow!
Export the CSV from the Mix Notes app and email it to yourself. You'll then be able to open it and generate Pro Tools markers using this SoundFlow script. they will appear on your selected Marker Track.
Mix Notes CSV to PT Markers.
----
// Prompt for CSV file
const fileInfo = sf.interaction.selectFile({
prompt: "Select Mix Notes CSV File"
});
// Read the CSV File
if (fileInfo.path.endsWith(".csv")) {
var fileContents = sf.file.readText({ path: fileInfo.path }).text;
} else {
log("Not a valid CSV File")
throw 0
}
// Parse data into lines
var lines = fileContents.split('\n');
var data = [];
for (var i = 0; i < lines.length; i++) {
if (lines[i].trim() !== '') { // Skip empty lines
data.push(lines[i].split(','));
}
}
// Marker color names, in Pro Tools number order
const colorArray = ["Purple", "Lavender", "Pink", "Fuchsia", "Red", "Orange", "Yellow", "Lemon", "Mint", "Green", "Cyan", "Sky", "Blue", "White", "Grey", "Black"]
// Make PT Markers
for (var i = 1; i < data.length; i++) { // Start at 1 to skip header
var markerNo = data[i][0]
var timecode = data[i][1]
var markerColour = data[i][2]
var markerName = data[i][3]
var markerComment = data[i][4]
var colorArrayIndex = colorArray.indexOf(markerColour) + 1
sf.app.proTools.createMemoryLocation({
timeProperties: "Marker",
reference: "Absolute",
startTime: timecode,
name: markerName,
comments: markerComment,
colorIndex: colorArrayIndex
})
}
----