user48939: Context:
I have an audio track separated into individual channels grouped by frequency and speaker location. I need to play all three of these channels simultaneously and perform instructions like play, stop, repeat, skip across all channels to keep them in sync.
This is part of an outdoor installation so the solution must be modular and robust.
If possible, the most elegant solution I could come up with is to use an Arduino Leonardo and stack 3 Adafruit Music Maker Shield on each other.
Reasons why I think it might be technically feasible:
1. Each shield can share communication over I2C

Looking at the VS1053b Datasheet (the IC used in the shield) the chip at max load consumes Maximum 60mA, and typically 37mA. Arduino can drive a max of 500mA so these three shields should consume a small portion of that.
The Arduino will also be powered via 12v power supply.

Details i'm not so clear on:

How will I differentiate between each shield when sending instructions or do I need to even need consider this if I want them to function as one?


user359: The shield actually uses SPI.
So you will need to trace the chip select and make sure that each shield uses a different arduino pin.

user37622: The shields use SPI. There are more slave select pins on the shield for different devices of the shield. The first shield can use the default pins, but on next shields you must bend the default pins of the shield to side and connect them with a jumper cable to other set of pins of Arduino.
Then in sketch you need to define the select pins in constructor for each instance of the handling object Adafruit_VS1053.
Adafruit_VS1053_FilePlayer musicPlayer = 
  Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);
Adafruit_VS1053_FilePlayer musicPlayer2 = 
  Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS_2, SHIELD_DCS_2, DREQ_2, CARDCS);
Adafruit_VS1053_FilePlayer musicPlayer3 = 
  Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS_3, SHIELD_DCS_3, DREQ_3, CARDCS);

They will be not in microseconds sync since you must instruct them individually.
Use only one SD card because the SD library can't support more of them. Advantages of one SD card are only one cs pin and less active devices on SPI. There is no direct read by the player from SD card on the same shield.
Note: The SPI device is the SD card not the adapter. An empty adapter is nothing on bus so you can put the card for example into the shield on top and do not need bend the SD card cs pins on other shields.

48939: <p><strong>Context:</strong>
I have an audio track separated into individual channels grouped by frequency and speaker location. I need to play all three of these channels simultaneously and perform instructions like play, stop, repeat, skip across all channels to keep them in sync.</p>
<p>This is part of an outdoor installation so the solution must be modular and robust.</p>
<p>If possible, the most elegant solution I could come up with is to use an <a href="https://store.arduino.cc/usa/arduino-leonardo-with-headers" rel="nofollow noreferrer">Arduino Leonardo</a> and stack 3 <a href="https://www.adafruit.com/product/1790" rel="nofollow noreferrer">Adafruit Music Maker Shield</a> on each other.</p>
<p><strong>Reasons why I think it might be technically feasible:</strong></p>
<p><s>1. Each shield can share communication over I2C</s></p>
<ol start="2">
<li>Looking at the <a href="https://cdn-shop.adafruit.com/datasheets/vs1053.pdf" rel="nofollow noreferrer">VS1053b Datasheet</a> (the IC used in the shield) the chip at max load consumes Maximum 60mA, and typically 37mA. Arduino can drive a max of 500mA so these three shields should consume a small portion of that.
The Arduino will also be powered via 12v power supply.</li>
</ol>
<p><strong>Details i'm not so clear on:</strong></p>
<ol>
<li>How will I differentiate between each shield when sending instructions or do I need to even need consider this if I want them to function as one?</li>
</ol>
 359: <p>The shield actually uses SPI.</p>

<p>So you will need to trace the chip select and make sure that each shield uses a different arduino pin.</p>
 37622: <p>The shields use SPI. There are more slave select pins on the shield for different devices of the shield. The first shield can use the default pins, but on next shields you must bend the default pins of the shield to side and connect them with a jumper cable to other set of pins of Arduino.</p>

<p>Then in sketch you need to define the select pins in constructor for each instance of the handling object Adafruit_VS1053.</p>

<pre><code>Adafruit_VS1053_FilePlayer musicPlayer = 
  Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS);
Adafruit_VS1053_FilePlayer musicPlayer2 = 
  Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS_2, SHIELD_DCS_2, DREQ_2, CARDCS);
Adafruit_VS1053_FilePlayer musicPlayer3 = 
  Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS_3, SHIELD_DCS_3, DREQ_3, CARDCS);
</code></pre>

<p>They will be not in microseconds sync since you must instruct them individually.</p>

<p>Use only one SD card because the SD library can't support more of them. Advantages of one SD card are only one cs pin and less active devices on SPI. There is no direct read by the player from SD card on the same shield.</p>

<p>Note: The SPI device is the SD card not the adapter. An empty adapter is nothing on bus so you can put the card for example into the shield on top and do not need bend the SD card cs pins on other shields.</p>
