The core objects handle the basic needs of DirectMusic: input, output, and timing. These objects are most often managed by other objects such as DirectMusicPerformance, and you might never need to use their interfaces directly.
The DirectMusic object, represented by the IDirectMusic interface, is used for creating ports and buffers, for connecting with DirectSound, and for setting up a master clock. There should not be more than one instance of this object per application.
Many applications never need to use the IDirectMusic interface directly. In this respect it differs from other DirectX base interfaces. For example, IDirectSound is the starting point for every DirectSound application, performing essential tasks such as setting the cooperative level and creating sound buffers. In DirectMusic, most initialization is handled by other objects such as DirectMusicPerformance, and these objects are created independently by direct calls to CoCreateInstance.
Each device that sends or receives music data is encapsulated in a DirectMusicPort object. The methods of the IDirectMusicPort interface allow direct manipulation of the port, but most applications do not need to use these methods, because the port is managed by the performance. For example, you assign channels to a port through the DirectMusicPerformance object so that data in those channels is correctly routed.
The IDirectMusicBuffer interface represents the data currently ready to be played by the port (or read from the port). Most applications don't deal directly with the buffer object, but methods are available to directly manipulate its contents.
The IDirectMusicThru interface is used to set up direct transmission of data from a capture port to another port.
Objects that implement the IReferenceClock interface represent the master clock that synchronizes all DirectMusic activity, and the latency clock of a port.