EM shutter almost working. Still a few things needed...

For a response time of one millisecond, using the loop function and avoiding the ISR should work very well. Perhaps if you sleep on it there will be less hair ripped out?

You can mix delay(...) and millis() but it is usually not a good idea because it confuses some people. Once you get used to using millis() and keeping track of state, you may wonder why you ever bothered with delay(...).

Figure out your states, such as waiting to be triggered, shutter open, waiting with shutter open, shutter closed, waiting while film advances, etc. Experts use an enum but you can just assign an integer to each one and keep track of the current state by using an int variable. Use a switch/case statement to do the right thing for the current state. Use the loop() function to do the looping that you will need to do.

Use an unsigned long variable to hold the time [millis()] of an interesting event, and use subtraction to determine whether sufficient time has elapsed since the interesting event.

I am tempted to write the code myself but I do not really understand what you are attempting to accomplish.