Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CoreMIDI4J doesn't like repeatedly disconnecting devices #19

Closed
eclab opened this issue May 30, 2017 · 112 comments
Closed

CoreMIDI4J doesn't like repeatedly disconnecting devices #19

eclab opened this issue May 30, 2017 · 112 comments

Comments

@eclab
Copy link

eclab commented May 30, 2017

I'm getting a lot of crashes after disconnecting devices and reconnecting again (perhaps 3 or 4 times -- not many!). This is in Edisyn (https://github.com/eclab/edisyn/), from selecting the "MIDI:Change MIDI" menu 3 or 4 times. Try it out! I'm running Java 1.7.0_51 on OS X 10.9.5. I'll usually get a hang or a hard VM dump. Example VM dump stack trace:

uk.co.xfactorylibrarians.coremidi4j.CoreMidiException: Exception in CoreMIDI JNI Library by "MIDIPortDisconnectSource" - OS STatus Code: ffffd5af
	at uk.co.xfactorylibrarians.coremidi4j.CoreMidiInputPort.midiPortDisconnectSource(Native Method)
	at uk.co.xfactorylibrarians.coremidi4j.CoreMidiInputPort.disconnectSource(CoreMidiInputPort.java:71)
	at uk.co.xfactorylibrarians.coremidi4j.CoreMidiSource.close(CoreMidiSource.java:130)
	at edisyn.Synth.gatherMidiDevices(Synth.java:1203)
	at edisyn.Synth.setupMIDI(Synth.java:486)
	at edisyn.Synth.setupMIDI(Synth.java:468)
	at edisyn.Synth$14.actionPerformed(Synth.java:780)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
	at com.apple.laf.ScreenMenuItem.actionPerformed(ScreenMenuItem.java:128)
	at java.awt.MenuItem.processActionEvent(MenuItem.java:669)
	at java.awt.MenuItem.processEvent(MenuItem.java:628)
	at java.awt.MenuComponent.dispatchEventImpl(MenuComponent.java:351)
	at java.awt.MenuComponent.dispatchEvent(MenuComponent.java:339)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:738)
	at java.awt.EventQueue.access$200(EventQueue.java:103)
	at java.awt.EventQueue$3.run(EventQueue.java:694)
	at java.awt.EventQueue$3.run(EventQueue.java:692)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:708)
	at java.awt.EventQueue$4.run(EventQueue.java:706)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGBUS (0xa) at pc=0x00007fff754e8340, pid=18392, tid=77059
#
# JRE version: Java(TM) SE Runtime Environment (7.0_51-b13) (build 1.7.0_51-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.51-b03 mixed mode bsd-amd64 compressed oops)
# Problematic frame:
# C  [CoreFoundation+0xe6899340]  OBJC_METACLASS_$___NSCFString+0x0
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /Users/sean/java/distros/edisyn.git/trunk/hs_err_pid18392.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
#
@eclab
Copy link
Author

eclab commented May 30, 2017

Forgot to include the err log.
err.log.zip

@eclab
Copy link
Author

eclab commented May 31, 2017

An additional bug, but one that I cannot produce a log for. It looks like you can't dynamically allocate receivers.

  1. I allocate three devices via uk.co.xfactorylibrarians.coremidi4j.CoreMidiDeviceProvider.getMidiDeviceInfo();

  2. I open a transmitter on one device, and a receiver on two others.

  3. I use them a bit, then close the receivers and transmitters.

  4. I then open a new transmitter on one device, and a receiver on two others.

  5. On opening one of the receivers, the entire system reliably hangs hard and permanently.

Due to this and the previous bug, at present I have no choice but to create devices initially, then create hand-coded pipes for the receivers and transmitters that manage opening and closing. This works but means that I cannot dynamically handle new devices coming online if the user plugs a synth into his computer after the software has been launched.

@DerekCook
Copy link
Owner

Hi, Sorry for the delay in replying. I am away on business and working manic hours, so not sure when I will get to look at this. It would be helpful if you can provide some sample code that guarantees both of the crashes you are talking about to give us something to work with in addition to the descriptions that you have provided.

@brunchboy
Copy link
Collaborator

Yes, sorry, I am incredibly buried with my other projects as well, and don’t know when I might have time to look at issues like this, but sample code that reproduces it reliably will definitely be key. Derek, if you do happen to find and fix it, I will of course make time to publish a new release.

@BradleyRoss
Copy link

Just a thought. When you close all the transmitters and receivers, make sure that the devices are open before opening the new transmitters and receivers. (MidiDevice.isOpen()) I saw something that indicated that the devices may close if the receivers and transmitters are closed. I'm curious and will try running your project.

@eclab
Copy link
Author

eclab commented Jun 19, 2017 via email

@eclab
Copy link
Author

eclab commented Jun 19, 2017 via email

@BradleyRoss
Copy link

To eclab

I don't see the attached code

@eclab
Copy link
Author

eclab commented Jun 19, 2017

Sorry, it looks like github silently removes files with "unsupported extensions" from email messages. :-( And for some reason I cannot fathom, .java is an unsupported extension. Try now.

@BradleyRoss
Copy link

For one thing, you are testing if the various objects are not null, but I think you also need to check if the devices, transmitters, and receivers are open. The synchronized lock doesn't appear right. See http://winterbe.com/posts/2015/04/30/java8-concurrency-tutorial-synchronized-locks-examples/ and the java.util.concurrent.locks package. It looks like it should be synchronized(this) according to the winterbe.com blog post.

I'm going to have to look at this in more detail, but that is the result of my first look.

See https://stackoverflow.com/questions/10963205/how-to-attach-file-to-a-github-issue It appears that the acceptable file types are PNG, GIF, JPG, DOCX, PPTX, XLSX, TXT, or PDF

@eclab
Copy link
Author

eclab commented Jun 20, 2017 via email

@DerekCook
Copy link
Owner

Hi, Apologies for lack of response. I am am away on business and currently rammed. Any free time I have I have on programming is currently spent resolving an issue I have with one of my Java Librarians that use CoreMIDI4J. Will look at this as soon as I can, but if you can find the issue and generate a pull request then I am sure that James and I will be able to respond to that much more quickly. I am happy to consider extending who can actively contribute as well if you have the interest. CoreMIDI4J was put here so it could be supported unlike the older providers..

@brunchboy
Copy link
Collaborator

I should have some time to play with this over the weekend too, I hope. My massive updates to dysentery, beat-link, and beat-link-trigger are out in preview form, and feedback is settling down into a happy place.

@brunchboy
Copy link
Collaborator

brunchboy commented Jul 2, 2017

So I have been poking a bit at this, and do not have a definitive answer yet. I discovered that the example was crashing trying to free a bit of memory that was not allocated, in CoreMidiInputPort.cpp at line 261, free((void *) memoryReference);

Now, I am not going to be nearly as efficient at debugging this as Derek might because I did not create these classes and I don’t understand the details of their relationships yet, but I did notice a few things that made me go “hmm.” The open() and close() methods in CoreMidiSource do not protect themselves against being called more than once, and in those circumstances will try to free the same block of memory more than one time, which would lead to this kind of crash.

Indeed, I just tried adding protection against this, and the crash has gone away, the example program has been running with no problems for twenty minutes now. I will want to go through the other classes and add similar protections, but this seems a step in the right direction. In the mean time I will make a preview release with this fix in it and see if it addresses Sean’s ( @eclab ) issue at all.

@DerekCook I also notice that the close() method in CoreMidiSource simply clears the list of transmitters; should it not also close them?

brunchboy added a commit that referenced this issue Jul 2, 2017
Make sure CoreMidiSource and CoreMidiDestination are protected against
being opened or closed multiple times.

Also improves conformance with the Java MIDI SPI spec by returning
empty lists when there are no receivers/transmitters rather than NULL.
@brunchboy
Copy link
Collaborator

brunchboy commented Jul 2, 2017

OK, @eclab here is a preview version with this fix present, can you see if it behaves better for you? I have to zip it up, as we noted earlier in the discussion.

I have removed this earlier snapshot because it has been superseded by a newer one below.

@brunchboy
Copy link
Collaborator

@DerekCook I fixed a couple of places where we were returning NULL when we should have been returning an empty list according to the SPI spec as well. But I also see that we are not maintaining a list of receivers in CoreMidiDestination (the comment says “We do not maintain a list of receivers, as they tend to be transitory context”). To properly implement the MIDI SPI spec, we should probably go ahead and add this feature. We are also supposed to remove receivers and transmitters from our lists when they are closed. Doesn’t CoreMidi keep these lists for us already, perhaps?

@brunchboy
Copy link
Collaborator

brunchboy commented Jul 2, 2017

Everyone, here is a newer snapshot in which I have gone ahead and implemented the rest of the things we are supposed to do in terms of tracking transmitters and receivers that we create, as well as removing them when they get closed, and closing them when their parent MIDI device closes. This makes us much more correctly implement the MIDI Service Provider Interface contract, and will hopefully fix the problems @eclab was seeing. @DerekCook , this is enough of a change that you probably want to test it with some of your synths as well. But if it looks good to everyone, we should probably make another release with it soon.

Again, snapshot removed because there is a newer one below.

@brunchboy
Copy link
Collaborator

And here is one more (last, I hope?) snapshot version to try. I further noticed that we were not closing our devices when we notice them disappearing from the MIDI environment. This cleans that up, so that if anyone is holding on to a device reference for something that has been detached from the MIDI environment (or any receivers or transmitters associated with such a device), they will properly be marked as closed, and give you appropriate exceptions when you try to use them at that point. Again, you will have to unzip this in order to test it.
coremidi4j-1.1-SNAPSHOT.jar.zip

@eclab
Copy link
Author

eclab commented Jul 2, 2017 via email

@brunchboy
Copy link
Collaborator

No worries! Our turnaround was not particularly fast in responding to your report, so that is only fair. 😁 And I suspect it may be a while before Derek has time to do his testing too.

@DerekCook
Copy link
Owner

James, Thanks very much for getting here first. I of course trust your judgement in what the correct behaviour should be, and the focus in the early days was getting something that worked that undoubtedly would need improvement!

I will be back home soon, and will be doing a new release of my librarians as a have quite a few fixes batched up (have been able to work on them whilst away on a laptop (but no synths and MIDI devices), so will need to do some synth testing, and I will do that with then new release of CoreMIDI4J.

@brunchboy
Copy link
Collaborator

That sounds perfect. And of course, I understand well the challenge of getting this library working at all, and the plan of polishing rough edges as we find them! I was so daunted by the prospect of the initial implementation that I waited for you to come along and do it. I’m glad to be able to contribute a bit from time to time.

@DerekCook
Copy link
Owner

Have tried the new release with all of my librarian and synth combinations, and all looks good. But suggest we keep this open until we hear from Sean.

@brunchboy
Copy link
Collaborator

Thanks, that’s great (and fast)! And I agree.

@brunchboy
Copy link
Collaborator

@eclab I hope you had a lovely vacation, and will have a chance to test this fix.

@eclab
Copy link
Author

eclab commented Aug 5, 2017 via email

@DerekCook
Copy link
Owner

Hi, when you get time, please give this a go and let us know how it works for you.

@eclab
Copy link
Author

eclab commented Sep 12, 2017

I think that your proposal is basically the same as mine. I had one other gizmo: a variety of USB MIDI hardware just calls itself the generic "USB MIDI Device". We'd like to be able to rename that. Since we can rename the device name, I had added:

  • If the endpoint name is "USB MIDI Device" and the device name is non-null, use the device name.

@brunchboy
Copy link
Collaborator

I saw that, but I did not think it made sense to try to interpret the meaning of non-null endpoint names. There is no way we could predict all the ways that different manufacturers might give their devices useless endpoint names. That’s why I say we should honor the name that the user assigns the device in the Audio MIDI Setup control panel, and always show it in some way if it is not null.

@eclab
Copy link
Author

eclab commented Sep 12, 2017 via email

@DerekCook
Copy link
Owner

DerekCook commented Sep 12, 2017

@eclab before I consider all of the above (where in a lot of places we all seem to be in danger of agreeing in most places), can you please:

  • Run the latest snapshot above and see what it returns on your system and report back

  • Take, for example, your microSampler, edit the Description in the Device panel and run again and see what you get.

  • Likewise, can you change the descrption of these "USB MIDI Devices"?

I don't have much time for a detailed response this morning, as I need to high tail it into work early, but, unless I am mistaken, I think there is some confusion on what is going to be returned as the name under the new scheme - but I would like it verified on what is happening on your system.

Just taking one example end point from your log for your microsampler

End Point 
  End Point Reference                  3747857
  End Point kMIDIPropertyName          MIDI IN
  End Point kMIDIPropertyModel         microSAMPLER
  End Point kMIDIPropertyManufacturer  KORG INC.
  End Point kMIDIPropertyOffline       0
  End Point kMIDIPropertyUniqueID      1606973723
  End Point kMIDIPropertyDriverVersion 0

  Entity    Reference                  3747856
  Entity    kMIDIPropertyName          Port 1
  Entity    kMIDIPropertyModel         microSAMPLER
  Entity    kMIDIPropertyManufacturer  KORG INC.
  Entity    kMIDIPropertyOffline       0
  Entity    kMIDIPropertyUniqueID      -2016484299
  Entity    kMIDIPropertyDriverVersion 0

  Device    Reference                  3747855
  Device    kMIDIPropertyName          microSAMPLER
  Device    kMIDIPropertyModel         microSAMPLER
  Device    kMIDIPropertyManufacturer  KORG INC.
  Device    kMIDIPropertyOffline       0
  Device    kMIDIPropertyUniqueID      -593357463
  Device    kMIDIPropertyDriverVersion 0

  Number of entities                   2

This is end point data for a device with multiple entities - (2)

The name that CoreMIDI4J should return is microSAMPLER MIDI IN

Can you please verify that this is what happens when you run the new snapsot?

@DerekCook
Copy link
Owner

Hi

I had some time tonight to compare suggestions. @eclab suggested

NAME:
    dname = ""
    ename = ""
    If endpoint.kMIDIPropertyName != null && !device.endpoint.kMIDIPropertyName.equals("USB MIDI Device")
        ename = endpoint.kMIDIPropertyName;
    If device.kMIDIPropertyName != null && !device.kMIDIPropertyName.equals(endpoint.kMIDIPropertyName)
        dname = device.kMIDIPropertyName;
    if (ename.equals("") && dname.equals(""))
        return "USB MIDI Device"
    else if (ename.equals(""))
        return dname;
    else if (dname.equals(""))
        return ename;
    else
        return ename + " (" + dname + ")";

It's not dissimilar to what I have done but I think it is over complicated for the examples I have seen on my own system and what the debug info provided. @brunchboy 's suggestion is simpler

 If either of the endpoint or device name is `null`, return only the other. (If both are `null`, just return some generic “unknown device” name as already proposed).

* If the endpoint and device name are both present, and both have the same value, return just one of them, to avoid redundancy.

* If the endpoint and device name are both present and different, return something like `Device Name (Endpoint Name)` or `Endpoint Name - Device Name`, whatever seems to make the most sense.

I agree with this apart from the final point. I see no reason to return the endpoint name for a device with a single or no entity if you have a device description. If the user has not edited that description then you get the default device name set by the manufacturer (usually the same as the endpoint name), otherwise you get what the user wants.

The time when it makes sense to combine the Device Name and Endpoint name is when the entity count is more than one. In this case append the endpoint name to the device name.

My code is as follows

    if ( deviceName != NULL ) {

      CFStringAppend(buildName, (deviceName != NULL ) ? deviceName :  CFSTR("<Unknown Device>") );
    
      if ( numberOfEntities > 1 ) {
      
        CFStringAppend(buildName, CFSTR(" "));
        CFStringAppend(buildName, (entityName != NULL ) ? entityName :  CFSTR("** NULL POINTER for Entiry Name **") );
      
      }
    
    } else {
      
      CFStringAppend(buildName, (endpointName != NULL ) ? endpointName :  CFSTR("<Unknown Device>") );
      
    }
    

What this means
Device Name = NULL AND End Point Name = NULL THEN name is "Unknown Device"
Device NAME = NULL AND End Point Name != NULL THEN name is End Point Name
Device Name != NULL AND Entity count <= 1 THEN name = Device Name
Device Name != NULL AND Entity count > 1 THEN name = Device Name + Endpoint Name

As an example, under the old code that only used the end point name, my Motif Rack ES would return
Port 1
Port 2
...
Port 8

From those end point descriptions, I don't really know (other than by surmising) that these ports are from my Motif. What if I had another synth using those end point names. How do I tell them apart?

That is why when there are multiple entities, adding the end point name to the device name gives a meaningful description. For my Motif Rack with Device Name Motif Rack ES the port names will be
Motif Rack ES Port 1
Motif Rack ES Port 2
...
Motif Rack ES Port 8

For @eclab's microSampler you should get
microSampler MIDI OUT
microSampler SOUND
microSampler MIDI IN
microSampler KBD/KNOB

I think these are far more meaningful names than just using the end point name when there are multiple end points, and the implementation is simpler than suggested.

As mentioned, I would be grateful if you could run the snapshot on your system (it still has the native debug info in) and report bck what you get

Latest snapshot reattached here for convenience.

coremidi4j-1.1-SNAPSHOT.jar.zip

@brunchboy
Copy link
Collaborator

I agree, Derek, I am eager to see what Sean gets running that snapshot on his system. It may well be that your current approach is perfectly good. The situation I was trying to protect against, which may be a non-issue, is if there are manufacturers of single-entity devices whose device names are utterly generic and indistinguishable, especially if you have multiple such devices connected. In such cases, yes, you can edit the device name if you know how to do that, but you may have a hard time figuring out which is which, or may not know you can do that.

But if we don’t have any such devices today, there is a good argument for waiting until someone reports an issue about one.

@DerekCook
Copy link
Owner

Hi, James

Agreed, but at that point you should be able to edit the descriptions to distinguish them, which is covered by my code in response to #21 .

I just need to know if the code is working now. Looks good from here.

@brunchboy
Copy link
Collaborator

Yes, understood! Looks good to me too. And we can add some instructions on the project page telling people how to rename their devices if they need to.

@eclab
Copy link
Author

eclab commented Sep 14, 2017

I'm posting a new log of attached devices. There's good news and bad news. The good news is that all but one of my devices has a rational name now. The bad news is that the microSAMPLER names aren't right.

I'm adding a new USB device to the log: an Eventide ModFactor pedal. The names I get displayed are:

microSAMPLER Port 1
microSAMPLER Port 2
USB MIDI Device Port 1
USB MIDI Device Port 2
MIDI Monitor (Untitled)
PreenFM mk2
USB MIDI Device [the Tascam US 2x2]
ModFactor Pedal

The bad ones here are microSAMPLER Port 1 and microSAMPLER Port 2. There are four java MIDI Devices presented from the microSAMPLER: two transmitters and two receivers. The transmitters are called "KBD/KNOB" and "MIDI IN", and the two receivers are called "SOUND" and "MIDI OUT" (I may have mixed some of these up). But when presented in Java, now they're both called Port 1 and Port 2.

I believe the reason for this is that the current snapshot may be using the entity name, not the endpoint name. On the microSAMPLER (and I have no doubt also the MicroKorg etc.) the entity name is not descriptive. Would it be possible to use the endpoint name instead?

As to only using the device name if there's a single entity, that seems reasonable to me, though what happens if you have one device, one entity, but two endpoints with different names? For example, imagine the microSAMPLER with only one port, named SOUND and KBD/KNOB at its in and out. They'd both be just called microSAMPLER. I guess that's not a big deal, but...

log.zip

@DerekCook
Copy link
Owner

DerekCook commented Sep 14, 2017

Thanks. Yes, I've picked up the entity name by mistake whilst doing some clean up. It should indeed be the endpoint name. My bad.

I didn't spot that as my main rack with my Motif Rack ES is in the keyboard room and weighs a ton, so I didn't haul it back in after the change. Should have checked with it as well.

I'll fix that tonight (and check with the Motif) and we should be there.

Regarding your final point: entity end points usually do have the same name, it's the microsampler that seems to do things differently compared to all the other interfaces I have seen. But end points are in/out pairs, so you usually present them in different lists. But I can do a name compare and add the end point name if they are different.

@eclab
Copy link
Author

eclab commented Sep 14, 2017

Fair point on your final case. I've not seen that, have you?

No, just thinking out loud. I've checked the MicroKorg XL manual and it has the same four endpoints as the Microsampler. But I wonder if the original Microkorg has only two endpoints and one device. I know someone who owns one: I might be able to check. It seems an obvious candidate.

@DerekCook
Copy link
Owner

OK. I have changed my text above, so what you quoted has disappeared. But if you can check this original MicroKorg it would be interesting

@brunchboy
Copy link
Collaborator

It sounds like we’re getting very close! If you want me to test tonight’s version with some other random MIDI hardware I have lying around I can do so as well. This is going to be a good release, my output menu in Beat Link Trigger is already much more meaningful, though I will definitely have to warn my users to go through and reconfigure all their existing triggers, as the names of many outputs will have changed.

@eclab
Copy link
Author

eclab commented Sep 14, 2017 via email

@DerekCook
Copy link
Owner

Hi, yes the more devices we can test with between us the better. Mght as well crack any issues now!

I've checked all of my interfaces/devices here, including dragging my Rack with the Motif In to be beside my Mac. Looks like I missed the entity instead of endpoint name issue because the Motif Entity and Endpoint names are the same. Silly mistake, mind! Also caught another small little bug with the extended info I now put into CoreMidiDeviceInfo, so that is fixed as well.

Anyhow, try this one. It still has the debug info uncommented. If it looks good, I will remove the debug info and push the latest code back to Github ready for a release.

I did not have time to do anything other than correct the end point name, as it has been a very long day over here. But I think that will do for now.

coremidi4j-1.1-SNAPSHOT.jar.zip

As James says, we will need to make our users aware of name changes (my x.factory librarians warn when they can't find the port name on startup), but I think it is for the better. I certainly find the names more meaningful esp with my Motif and its multiple entities. My Kronos and Montage are the same, but I have not written librarians for them yet. It will certainly avoid future confusion in my setup when they are added!

@brunchboy
Copy link
Collaborator

The default names of all of my MIDI devices look good. In many cases, far better than they used to. As far as I am concerned, this release is ready to be shared with the world.

@DerekCook
Copy link
Owner

Thanks, James. Good to hear. I'll finish the code off tonight and push to the main branch in preparation.

@DerekCook
Copy link
Owner

Hi. Have commented out the debug code and pushed the changes to the main branch.

@brunchboy
Copy link
Collaborator

Thanks, Derek. I will wait a bit in the hopes @eclab has a chance to test the latest snapshot, but plan on deploying a release this weekend barring any surprises.

@eclab
Copy link
Author

eclab commented Sep 15, 2017 via email

@eclab
Copy link
Author

eclab commented Sep 16, 2017

Looking good. My devices display as:

microSAMPLER KBD/KNOB [in only]  and  microSAMPLER SOUND [out only]
microSAMPLER MIDI IN [in only] and microSAMPLER MIDI OUT [out only]
ModFactor Pedal
USB MIDI Device  [Renamable to Tascam US 2x2]
Zero MkII Port 1  [both in and out]
Zero MkII Port 2  [both in and out]
ModFactor Pedal
PreenFM mk2

@DerekCook
Copy link
Owner

DerekCook commented Sep 16, 2017

Great. Thanks for reporting back. Looks like a wrap then, for now, and I need to get back to other things.

James, when I get five minutes, I will think of some words to explain the name changes that can go into the release notes.

@brunchboy
Copy link
Collaborator

Thanks again for all this work, Derek! Let me know if you do, otherwise I was going to write something up myself during the release process. We’ll see who gets there first.

@brunchboy
Copy link
Collaborator

I am working on a fairly detailed explanation of this change, with sections aimed both at developers using our library, and end-users of their applications, since I will then be able to point my Beat Link Trigger and Afterglow users at the right heading, so if you haven’t started yet, @DerekCook, you may want to wait and see if my effort meets your needs as well.

@DerekCook
Copy link
Owner

No, I haven't started yet. Had to be in work today :-(

So I'll wait and see what you come up with, if you've started.

@brunchboy
Copy link
Collaborator

That’s fine! It saves us wasting or duplicating work. :) You can take a look at my draft and see what you think, I need to do other things for a bit. https://github.com/DerekCook/CoreMidi4J#device-names

@brunchboy
Copy link
Collaborator

I’m guessing you didn’t have time to take a look, but I am going to go ahead and do the release. We can change the README whenever and as often as we want if you find things you want added or changed.

@DerekCook
Copy link
Owner

Hi, no I did not get to look at it. It was a long day, and then chilling out and much needed sleep! I've had a quick look at the description this morning, and it is great. Covers most of what I wanted to say, so will just embellish it a little to add in my deltas. Thanks

@brunchboy
Copy link
Collaborator

Thanks for those improvements!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants