/* Rosegarden A sequencer and musical notation editor. This program is Copyright 2000-2008 Guillaume Laurent , Chris Cannam , Richard Bown The moral right of the authors to claim authorship of this work has been asserted. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. See the file COPYING included with this distribution for more information. */ #include "SoftSynthDevice.h" #include "Instrument.h" #include "MidiTypes.h" #include #include #include namespace Rosegarden { ControlList SoftSynthDevice::m_controlList; SoftSynthDevice::SoftSynthDevice() : Device(0, "Default Soft Synth Device", Device::SoftSynth) { checkControlList(); } SoftSynthDevice::SoftSynthDevice(DeviceId id, const std::string &name) : Device(id, name, Device::SoftSynth) { checkControlList(); } SoftSynthDevice::SoftSynthDevice(const SoftSynthDevice &dev) : Device(dev.getId(), dev.getName(), dev.getType()), Controllable() { // Copy the instruments // InstrumentList insList = dev.getAllInstruments(); InstrumentList::iterator iIt = insList.begin(); for (; iIt != insList.end(); iIt++) m_instruments.push_back(new Instrument(**iIt)); } SoftSynthDevice::~SoftSynthDevice() { } void SoftSynthDevice::checkControlList() { // Much as MidiDevice::generateDefaultControllers static std::string controls[][9] = { { "Pan", Rosegarden::Controller::EventType, "", "0", "127", "64", "10", "2", "0" }, { "Chorus", Rosegarden::Controller::EventType, "", "0", "127", "0", "93", "3", "1" }, { "Volume", Rosegarden::Controller::EventType, "", "0", "127", "0", "7", "1", "2" }, { "Reverb", Rosegarden::Controller::EventType, "", "0", "127", "0", "91", "3", "3" }, { "Sustain", Rosegarden::Controller::EventType, "", "0", "127", "0", "64", "4", "-1" }, { "Expression", Rosegarden::Controller::EventType, "", "0", "127", "100", "11", "2", "-1" }, { "Modulation", Rosegarden::Controller::EventType, "", "0", "127", "0", "1", "4", "-1" }, { "PitchBend", Rosegarden::PitchBend::EventType, "", "0", "16383", "8192", "1", "4", "-1" } }; if (m_controlList.empty()) { for (unsigned int i = 0; i < sizeof(controls) / sizeof(controls[0]); ++i) { Rosegarden::ControlParameter con(controls[i][0], controls[i][1], controls[i][2], atoi(controls[i][3].c_str()), atoi(controls[i][4].c_str()), atoi(controls[i][5].c_str()), Rosegarden::MidiByte(atoi(controls[i][6].c_str())), atoi(controls[i][7].c_str()), atoi(controls[i][8].c_str())); m_controlList.push_back(con); } } } const ControlParameter * SoftSynthDevice::getControlParameter(int index) const { if (index >= 0 && ((unsigned int)index) < m_controlList.size()) return &m_controlList[index]; return 0; } const ControlParameter * SoftSynthDevice::getControlParameter(const std::string &type, Rosegarden::MidiByte controllerValue) const { ControlList::iterator it = m_controlList.begin(); for (; it != m_controlList.end(); ++it) { if (it->getType() == type) { // Return matched on type for most events // if (type != Rosegarden::Controller::EventType) return &*it; // Also match controller value for Controller events // if (it->getControllerValue() == controllerValue) return &*it; } } return 0; } std::string SoftSynthDevice::toXmlString() { std::stringstream ssiDevice; InstrumentList::iterator iit; ssiDevice << " " << std::endl; for (iit = m_instruments.begin(); iit != m_instruments.end(); ++iit) ssiDevice << (*iit)->toXmlString(); ssiDevice << " " #if (__GNUC__ < 3) << std::endl << std::ends; #else << std::endl; #endif return ssiDevice.str(); } // Add to instrument list // void SoftSynthDevice::addInstrument(Instrument *instrument) { m_instruments.push_back(instrument); } }