{"id":859,"date":"2021-10-24T04:18:25","date_gmt":"2021-10-24T04:18:25","guid":{"rendered":"https:\/\/es-andreabianchini.it\/andrewsblog\/?p=859"},"modified":"2021-10-24T04:18:26","modified_gmt":"2021-10-24T04:18:26","slug":"semplice-sinth-midi","status":"publish","type":"post","link":"https:\/\/es-andreabianchini.it\/andrewsblog\/?p=859","title":{"rendered":"Semplice Sinth MIDI"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">MidiSinthDeviceService.java<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*\n * Copyright (C) 2015 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http:\/\/www.apache.org\/licenses\/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\/\n\npackage com.example.android.midisynth;\n\nimport android.media.midi.MidiDeviceService;\nimport android.media.midi.MidiDeviceStatus;\nimport android.media.midi.MidiReceiver;\n\nimport com.example.android.common.midi.synth.SynthEngine;\n\npublic class MidiSynthDeviceService extends MidiDeviceService {\n\n    private SynthEngine mSynthEngine = new SynthEngine();\n    private boolean mSynthStarted = false;\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n    }\n\n    @Override\n    public void onDestroy() {\n        mSynthEngine.stop();\n        super.onDestroy();\n    }\n\n    @Override\n    public MidiReceiver&#91;] onGetInputPortReceivers() {\n        return new MidiReceiver&#91;]{mSynthEngine};\n    }\n\n    \/**\n     * This will get called when clients connect or disconnect.\n     *\/\n    @Override\n    public void onDeviceStatusChanged(MidiDeviceStatus status) {\n        if (status.isInputPortOpen(0) &amp;&amp; !mSynthStarted) {\n            mSynthEngine.start();\n            mSynthStarted = true;\n        } else if (!status.isInputPortOpen(0) &amp;&amp; mSynthStarted) {\n            mSynthEngine.stop();\n            mSynthStarted = false;\n        }\n    }\n\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">MainActivity.java<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*\n * Copyright (C) 2015 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http:\/\/www.apache.org\/licenses\/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\/\n\npackage com.example.android.midisynth;\n\nimport android.content.pm.PackageManager;\nimport android.media.midi.MidiDevice.MidiConnection;\nimport android.media.midi.MidiDeviceInfo;\nimport android.media.midi.MidiManager;\nimport android.os.Bundle;\nimport android.support.v7.app.ActionBar;\nimport android.support.v7.app.AppCompatActivity;\nimport android.support.v7.widget.Toolbar;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.WindowManager;\nimport android.widget.Toast;\n\nimport com.example.android.common.midi.MidiOutputPortConnectionSelector;\nimport com.example.android.common.midi.MidiPortConnector;\nimport com.example.android.common.midi.MidiTools;\n\n\/**\n * Simple synthesizer as a MIDI Device.\n *\/\npublic class MainActivity extends AppCompatActivity {\n\n    private MidiOutputPortConnectionSelector mPortSelector;\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.main);\n        setSupportActionBar((Toolbar) findViewById(R.id.toolbar));\n        ActionBar actionBar = getSupportActionBar();\n        if (actionBar != null) {\n            actionBar.setDisplayShowTitleEnabled(false);\n        }\n\n        if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI)) {\n            setupMidi();\n        }\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        getMenuInflater().inflate(R.menu.main, menu);\n        setKeepScreenOn(menu.findItem(R.id.action_keep_screen_on).isChecked());\n        return true;\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        switch (item.getItemId()) {\n            case R.id.action_keep_screen_on:\n                boolean checked = !item.isChecked();\n                setKeepScreenOn(checked);\n                item.setChecked(checked);\n                break;\n        }\n        return super.onOptionsItemSelected(item);\n    }\n\n    private void setKeepScreenOn(boolean keepScreenOn) {\n        if (keepScreenOn) {\n            getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);\n        } else {\n            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);\n        }\n    }\n\n    private void setupMidi() {\n        \/\/ Setup MIDI\n        MidiManager midiManager = (MidiManager) getSystemService(MIDI_SERVICE);\n\n        MidiDeviceInfo synthInfo = MidiTools.findDevice(midiManager, \"AndroidTest\",\n                \"SynthExample\");\n        int portIndex = 0;\n        mPortSelector = new MidiOutputPortConnectionSelector(midiManager, this,\n                R.id.spinner_synth_sender, synthInfo, portIndex);\n        mPortSelector.setConnectedListener(new MyPortsConnectedListener());\n    }\n\n    private void closeSynthResources() {\n        if (mPortSelector != null) {\n            mPortSelector.close();\n        }\n    }\n\n    \/\/ TODO A better way would be to listen to the synth server\n    \/\/ for open\/close events and then disable\/enable the spinner.\n    private class MyPortsConnectedListener\n            implements MidiPortConnector.OnPortsConnectedListener {\n        @Override\n        public void onPortsConnected(final MidiConnection connection) {\n            runOnUiThread(new Runnable() {\n                @Override\n                public void run() {\n                    if (connection == null) {\n                        Toast.makeText(MainActivity.this,\n                                R.string.error_port_busy, Toast.LENGTH_SHORT)\n                                .show();\n                        mPortSelector.clearSelection();\n                    } else {\n                        Toast.makeText(MainActivity.this,\n                                R.string.port_open_ok, Toast.LENGTH_SHORT)\n                                .show();\n                    }\n                }\n            });\n        }\n    }\n\n    @Override\n    public void onDestroy() {\n        closeSynthResources();\n        super.onDestroy();\n    }\n\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>MidiSinthDeviceService.java MainActivity.java<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15,7],"tags":[],"class_list":["post-859","post","type-post","status-publish","format-standard","hentry","category-android","category-stem"],"_links":{"self":[{"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=\/wp\/v2\/posts\/859","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=859"}],"version-history":[{"count":1,"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=\/wp\/v2\/posts\/859\/revisions"}],"predecessor-version":[{"id":860,"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=\/wp\/v2\/posts\/859\/revisions\/860"}],"wp:attachment":[{"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=859"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=859"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/es-andreabianchini.it\/andrewsblog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=859"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}