#include <CoreAudio/CoreAudio.h>
#include <AudioToolbox/AudioToolbox.h>

int main(int argc, char *argv[])
{
  AUGraph AudioGraph;
  NewAUGraph(&AudioGraph);

  ComponentDescription cd;
  AUNode OutputNode;
  AudioUnit OutputUnit;

  cd.componentManufacturer = kAudioUnitManufacturer_Apple;
  cd.componentFlags = 0;
  cd.componentFlagsMask = 0;
  cd.componentType = kAudioUnitType_Output;
  cd.componentSubType = kAudioUnitSubType_DefaultOutput;

  AUGraphNewNode(AudioGraph, &cd, 0, NULL, &OutputNode);
  AUGraphGetNodeInfo(AudioGraph, OutputNode, 0, 0, 0, &OutputUnit);

  AUNode MixerNode;
  AudioUnit MixerUnit;

  cd.componentManufacturer = kAudioUnitManufacturer_Apple;
  cd.componentFlags = 0;
  cd.componentFlagsMask = 0;
  cd.componentType = kAudioUnitType_Mixer;
  cd.componentSubType = kAudioUnitSubType_StereoMixer;

  AUGraphNewNode(AudioGraph, &cd, 0, NULL, &MixerNode);
  AUGraphGetNodeInfo(AudioGraph, MixerNode, 0, 0, 0, &MixerUnit);

  AUGraphConnectNodeInput(AudioGraph, MixerNode, 0, OutputNode, 0);

  AUGraphOpen(AudioGraph);
  AUGraphInitialize(AudioGraph);
  AUGraphStart(AudioGraph);

  AUNode SynthNode;
  AudioUnit SynthUnit;

  cd.componentManufacturer = kAudioUnitManufacturer_Apple;
  cd.componentFlags = 0;
  cd.componentFlagsMask = 0;
  cd.componentType = kAudioUnitType_MusicDevice;
  cd.componentSubType = kAudioUnitSubType_DLSSynth;

  AUGraphNewNode(AudioGraph, &cd, 0, NULL, &SynthNode);
  AUGraphGetNodeInfo(AudioGraph, SynthNode, 0, 0, 0, &SynthUnit);

  AUGraphConnectNodeInput(AudioGraph, SynthNode, 0, MixerNode, 0);

  AUGraphUpdate(AudioGraph, NULL);
  CAShow(AudioGraph);

  MusicDeviceMIDIEvent(SynthUnit, 0x90, 60, 127, 0);
  sleep(1);
  MusicDeviceMIDIEvent(SynthUnit, 0x90, 62, 127, 0);
  sleep(1);
  MusicDeviceMIDIEvent(SynthUnit, 0x90, 64, 127, 0);
  sleep(1);

  sleep(5);

  return(0);
}

