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

New pat files #5

Closed
wants to merge 5 commits into from
Closed

New pat files #5

wants to merge 5 commits into from

Conversation

larsenv
Copy link
Contributor

@larsenv larsenv commented Jul 30, 2019

I managed to convert the soundfont into individual .pat files by instruments. It was quite a bit of work.

  1. Exported everything to sfz with Polyphone, a soundfont editor
  2. Converted them to .pat with a tool called "sfz2pat" (only in the soundfont-utils package on Fedora, was a pain, it was hard to find anything, I had to get a friend to make a Fedora VM to run the program)
  3. Renamed the .pat files by instrument and percussion. The instruments not present don't have .pat files.
  4. Fucked up a rebase because I forgot how to do them, and my file explorer isn't working properly so it was hard for me to commit without accidentally putting stuff in the "js" folder instead of the "pat" folder. I bookmarked a simple tutorial in case I forget again.

Also, the JavaScript console says that there's "missing patch files", referring to the .pat files. I guess they're in the wrong directory? I don't see where in the JS file it loads the .pat files.

I really hope this works.

@Difegue
Copy link
Owner

Difegue commented Jul 30, 2019

The missing patch files refers to the fact you don't have .pats for every existing instrument, but that was already the case with the old set.

I'll check out your branch and check that midi playback works as expected. Thanks!

@Difegue
Copy link
Owner

Difegue commented Jul 30, 2019

Well, looks like you're missing a bit too many instruments:

image

Looking at the branch, it seems you have 59 .pat files, which does match the number of instruments present in the soundfont. Maybe the names are off ?

@larsenv
Copy link
Contributor Author

larsenv commented Jul 31, 2019

The ones that are missing are instruments not present in the soundfont. I could fill in the blanks, in cases where a different piano is used.

@Difegue
Copy link
Owner

Difegue commented Jul 31, 2019

Thing is, it looks like the current instruments are never loaded by any of the .midi files.

I think there's a mismatch between how the soundfont and diyedit match the game's samples to midi instruments.

How to find out the difference though...I think this can only be done manually.

@larsenv
Copy link
Contributor Author

larsenv commented Jul 31, 2019

I took a look for a little while and I'm not sure why it's trying to load those. What I was originally doing today was copying over instrument pat files that sounded similar, but I stopped. Yours is trying to load instrument 127 for one of the songs, which actually is the instrument for "Gunshot". (yeah, I don't think that's an instrument used in the records).

The soundfont generator script in Ruby uses the piano noise as a fallback. What would be the best way to figure this out?

  • Is the soundfont missing some instruments?
  • Is DIYEdit not exporting properly?
  • Is the soundfont supposed to match up with the MIDIs? (I thought you said so)
  • Is the song not playing at all?
  • Is it just trying to load the instrument files and not generally trying to load the instruments?
  • Would extracting the soundfont from the game work any better?
  • Would it sound bad if we used the piano for a fallback for everything?

These all are questions that could help. I'd really appreciate your help, because this is bugging me and I want to see the soundfont working.

@larsenv
Copy link
Contributor Author

larsenv commented Jul 31, 2019

Oh, I forgot to mention - the soundfont works fine with the exported MIDIs when I use it with MuseScore or fluidsynth.

@Difegue
Copy link
Owner

Difegue commented Jul 31, 2019

I'm pretty sure the soundfont is complete: DIY's editor only has 32 instruments, not counting the drum sets.

Said instruments are a bit weird and don't map to the general MIDI instrument list very well. (For example, DIY's "baby voice" instrument doesn't exist at all in MIDI.)

Both the soundfont and DIYEdit try mapping the DIY instruments to general MIDI's list, but the mappings obviously aren't the same. (In hindsight, it was a bit naive of me to think they'd match as-is.)

Using the piano as fallback here would probably just use one instrument for everything and ruin every song, so it's not an option.

I can try looking in the DIYEdit source code to see how it maps instruments, but as it's decompiled and without comments I can't guarantee success.
The soundfont helpfully has the original names, so that's one less hurdle. If worst came to push, you'd have to figure out yourself by playing records in both their midi forms and in-game how the instruments are mapped.

#ReverseEngineering

@larsenv
Copy link
Contributor Author

larsenv commented Jul 31, 2019

There's actually 48 instruments (6 sets) and 112 rhythm tracks (8 sets).

Since MuseScore and fluidsynth read the song OK, so I'm wondering if the MIDI player in JS is trying to load all the wrong instruments? What happens when all the pats are present? Would only the piano play?

I'm making a record right now with all the instruments.

@larsenv
Copy link
Contributor Author

larsenv commented Jul 31, 2019

I tried the record with all the instruments, but the MIDI reduced it to 5 instruments because of the 5 tracks, it seems. They all are using the same piano type, even though the 1st track had 4 pianos in it. Just sent it to your Discord if you want to take a look at it.

Is it even possible to use the soundfont? Please test what happens if you copy over the missing pats over. Or I could try and send the pats to fill in the missing instruments. I've spent enough time on this and I don't want this to fail, it was fun converting all the pats.

@Difegue
Copy link
Owner

Difegue commented Jul 31, 2019

Soundboard.zip

For safekeeping.

@Difegue
Copy link
Owner

Difegue commented Jul 31, 2019

Got the mappings off DIYEdit quite easily:
instrumentCodes = {"Piano", "Organ", "Harpsichord", "Melodica", "Flute", "Trumpet", "Saxophone", "Wood Flute", "Acoustic Guitar", "Electric Guitar", "Banjo", "Bass", "Violin", "Marimba", "Vibraphone", "Timpani", "Star Drop", "UFO", "Alien", "Robot", "Rocket", "Moon", "Green Dude", "Phone Dial", "Cat", "Dog", "Pig", "Insects", "Frog", "Yoshi", "Birds", "Monkeys", "DoReMi Voice", "Wah Dude", "Opera Man", "Soul Girl", "Baby", "Laughing Men", "KungFu Men", "Humming", "DingDing", "PongPong", "FahFah", "BongBong", "BingBing", "TingTing", "BlingBling", "BoonBoon"};

instrumentConversion = {"0", "19", "6", "21", "73", "56", "66", "75", "24", "29", "105", "32", "40", "12", "11", "47", "111", "78", "36", "87", "53", "38", "80", "13", "82", "127", "122", "108", "55", "123", "53", "54", "30", "53", "85", "121", "57", "126", "91", "80", "80", "80", "80", "80", "80", "80", "80", "80"};

drumCodes = {"Normal Drums", "Electric Drums", "Samba Drums", "Asian Drums", "Kitchen Drums", "Toy Drums", "BeatBox Drums", "8bit Drums"};

drumConversion = {"[ACOUSTIC_BASS_DRUM]", "[ACOUSTIC_SNARE]", "[CLOSED_HI_HAT]", "[OPEN_HI_HAT]", "[CRASH_CYMBAL_1]", "[LOW_FLOOR_TOM]", "[HIGH_FLOOR_TOM]", "[LOW_MID_TOM]", "[SIDE_STICK]", "[HAND_CLAP]", "[TAMBOURINE]", "[SHORT_GUIRO]", "[MUTE_TRIANGLE]", "[OPEN_TRIANGLE]"};

A lot of different instruments are getting mapped to 80 at the end here, but that can be fixed. I'll try remaking those arrays to fit the soundfont and see where that gets us.

You can look at the midi conversion code itself here as I had to get it out of DIYEdit to tweak it a bit; It is unreadable as expected, though.

@larsenv
Copy link
Contributor Author

larsenv commented Jul 31, 2019

Nice. I didn't know that you could upload files on GitHub like that.

This is great, I didn't see this in the code. It's still not clear why it was loading those .pat files, though.

@Difegue
Copy link
Owner

Difegue commented Jul 31, 2019

It wasn't loading them because it didn't need them; midis spat out by DIYEdit only use the instrument codes depicted above. Some of them do match, like piano or timpani, so they should've played in the browser though but since the others don't load, libtimidity just fails silently.

I tried dissecting the soundfont to map the instruments but it's a complete mess; Some instruments are in the drum section or outright missing. I think a proper soundfont should be remade out of the game before going further.

@Difegue
Copy link
Owner

Difegue commented Jul 31, 2019

Also, I recommend using SynthFont and Vienna to look inside the .sf2 file.

@larsenv
Copy link
Contributor Author

larsenv commented Aug 1, 2019

I can use VGMTrans to extract the missing instruments (or extract everything), and convert them to .pat. The decompiled source code is really helpful.

We had 59 .pat files, I guess some of them were for the drums and the others were other sounds?

@Difegue
Copy link
Owner

Difegue commented Aug 1, 2019

Yup, the drums are in their own space (header 128), while the instruments are in header 0.
The soundfont has some weird stuff like the yoshi instrument being in drums and missing notes, for example.

If you do extract everything into a new font, tell me how you map the instruments in it so I can modify the source code accordingly. The current DIYEdit mapping maps all the 8-bit instruments ("DingDing", "PongPong", "FahFah", "BongBong", "BingBing", "TingTing", "BlingBling", "BoonBoon") to instrument 80.

@larsenv
Copy link
Contributor Author

larsenv commented Aug 1, 2019

So I'm working on renaming the array with the correct instruments. Almost all of the filenames will be the same (moving stuff like the Yoshi one). It seems some of the instrument names in the soundfont are not quite right...

@larsenv
Copy link
Contributor Author

larsenv commented Aug 1, 2019

OK, it was tedious and took a while to fix the array and rename a few things.

Here's the fixed array:

instrumentConversion = {"0", "18", "6", "22", "73", "56", "65", "75", "24", "29", "106", "33", "40", "13", "11", "47", "72", "78", "17", "42", "77", "59", "126", "124", "60", "61", "62", "123", "66", "125", "68", "122", "53", "54", "52", "49", "67", "121", "119", "48", "80", "80", "80", "80", "80", "80", "80", "80"};

I didn't find the 8-Bit sounds (I need a break), but there's some percussion instruments I moved (I only moved the percussion instruments that were not actually percussion). Want to help me do the 8-Bit and percussion?

Here's the instruments that I didn't find used in any of the instruments:

arachno-19.pat
arachno-38.pat
arachno-39.pat
arachno-61.pat
arachno-79.pat
arachno-80.pat
arachno-81.pat
arachno-82.pat
arachno-120.pat

@Difegue
Copy link
Owner

Difegue commented Aug 1, 2019

Re-rendered some midis with the new mappings: Loading them with libtimidity.js on the website still fails - I think it's not liking the .pats for some reason. Bleh.

I tried loading them with the soundfont itself in SynthFont and it's definitely closer!
Not quite perfect(and missing the 4 instruments you moved) but at least they play now.

psychoj-midis.zip
This .zip contains midis for the following PsychoJ covers so you can compare with game output easily:
http://youtube.com/watch?v=Qe9QVNr6vGA
http://youtube.com/watch?v=5IlQT9SEjH0

I whipped out the NDS for the unknown instruments to try and figure it out:

  • 19 - No idea atm
  • 38 - Robot
  • 39 - Robot too? Honestly those two sound so similar I wonder if the font isn't borked here
  • 61 - Dog
  • 79 to 82 - Sounds like horribly mangled versions of the 8-bit instruments.

I noticed your mappings were a bit of a mess past the base instruments, and that the DIYEdit instrument list has a bunch of instruments that aren't in the main game. Unused stuff, perhaps.

I've listed my findings in an Excel document here: https://1drv.ms/x/s!AtJBOSoSCRPJgYsOWzL0VuNly8LJoA?e=f3GNbn .

@larsenv
Copy link
Contributor Author

larsenv commented Aug 2, 2019

Hmm, I'm not sure why the .pat files aren't playing. Any errors in the console log?

Could you explain the difference between "old map", "new map" and "suggested map"?

@larsenv
Copy link
Contributor Author

larsenv commented Aug 2, 2019

Could you please try these .pat files? Maybe they'll work, I extracted the soundfont with a tool called "unsf". Just replace the .pat files only existing, not the whole folder, not everything's in here.

@Difegue
Copy link
Owner

Difegue commented Aug 2, 2019

Old map is the DIYEdit mapping, new map is yours, suggested map is what I found.

@Difegue
Copy link
Owner

Difegue commented Aug 2, 2019

I'm getting actual DIY samples to play in-browser now, so that's good.
Most of the errors appearing are still from missing patches, with actual JS exceptions rearing their head at the end if I play too many records with broken patches:

.Missing patch: arachno-47.pat libtimidity.js:99:15
Num Missing patches: 0 libtimidity.js:99:15
.Missing patch: MT32Drums/mt32drum-0.pat libtimidity.js:99:15
Num Missing patches: 1 libtimidity.js:99:15
.Missing patch: MT32Drums/mt32drum-3.pat libtimidity.js:99:15
Num Missing patches: 2 libtimidity.js:99:15
.Missing patch: MT32Drums/mt32drum-7.pat libtimidity.js:99:15
Num Missing patches: 3 libtimidity.js:99:15
.Missing patch: MT32Drums/mt32drum-11.pat libtimidity.js:99:15
Num Missing patches: 4 libtimidity.js:99:15
.Missing patch: arachno-110.pat libtimidity.js:99:15
Num Missing patches: 0 libtimidity.js:99:15
.Missing patch: arachno-94.pat libtimidity.js:99:15
Num Missing patches: 1 libtimidity.js:99:15
.Missing patch: arachno-71.pat libtimidity.js:99:15
Num Missing patches: 2 libtimidity.js:99:15
.Missing patch: arachno-62.pat libtimidity.js:99:15
Num Missing patches: 3 libtimidity.js:99:15
.Missing patch: arachno-52.pat libtimidity.js:99:15
Num Missing patches: 4 libtimidity.js:99:15
.Missing patch: MT32Drums/mt32drum-4.pat libtimidity.js:99:15
Num Missing patches: 5 libtimidity.js:99:15
.Missing patch: MT32Drums/mt32drum-6.pat libtimidity.js:99:15
Num Missing patches: 6 libtimidity.js:99:15
uncaught exception: abort() at abort@http://localhost:8080/DoujinSoft-2.1.0/js/libtimidity.js:5295:26
_abort@http://localhost:8080/DoujinSoft-2.1.0/js/libtimidity.js:4465:14
c0@http://localhost:8080/DoujinSoft-2.1.0/js/libtimidity.js:5119:1
bA@http://localhost:8080/DoujinSoft-2.1.0/js/libtimidity.js:5119:1
by@http://localhost:8080/DoujinSoft-2.1.0/js/libtimidity.js:5119:1
bx@http://localhost:8080/DoujinSoft-2.1.0/js/libtimidity.js:5119:1
cY@http://localhost:8080/DoujinSoft-2.1.0/js/libtimidity.js:5119:1
ccallFunc@http://localhost:8080/DoujinSoft-2.1.0/js/libtimidity.js:521:24
ccall@http://localhost:8080/DoujinSoft-2.1.0/js/libtimidity.js:480:10
f@http://localhost:8080/DoujinSoft-2.1.0/js/midi.js:1:5434
b@http://localhost:8080/DoujinSoft-2.1.0/js/midi.js:1:5535
playMidi@http://localhost:8080/DoujinSoft-2.1.0/js/init.js:174:10
onclick@http://localhost:8080/DoujinSoft-2.1.0/records#page-6:1:1

@Difegue
Copy link
Owner

Difegue commented Aug 2, 2019

.Missing patch: arachno-127.pat libtimidity.js:99:15
Num Missing patches: 0 libtimidity.js:99:15
.Missing patch: arachno-114.pat libtimidity.js:99:15
Num Missing patches: 1 libtimidity.js:99:15
.Missing patch: arachno-109.pat libtimidity.js:99:15
Num Missing patches: 2 libtimidity.js:99:15
.Missing patch: arachno-98.pat libtimidity.js:99:15
Num Missing patches: 3 libtimidity.js:99:15
.Missing patch: arachno-85.pat libtimidity.js:99:15
Num Missing patches: 4 libtimidity.js:99:15
.Missing patch: MT32Drums/mt32drum-0.pat libtimidity.js:99:15
Num Missing patches: 5 libtimidity.js:99:15
.Missing patch: arachno-116.pat libtimidity.js:99:15
Num Missing patches: 0 libtimidity.js:99:15
.Missing patch: arachno-109.pat libtimidity.js:99:15
Num Missing patches: 1 libtimidity.js:99:15
.Missing patch: arachno-105.pat libtimidity.js:99:15
Num Missing patches: 2 libtimidity.js:99:15
.Missing patch: arachno-94.pat libtimidity.js:99:15
Num Missing patches: 3 libtimidity.js:99:15
.Missing patch: arachno-87.pat libtimidity.js:99:15
Num Missing patches: 4 libtimidity.js:99:15
.Missing patch: arachno-71.pat libtimidity.js:99:15
Num Missing patches: 5 libtimidity.js:99:15
.Missing patch: arachno-62.pat libtimidity.js:99:15
Num Missing patches: 6 libtimidity.js:99:15
.Missing patch: arachno-54.pat libtimidity.js:99:15
Num Missing patches: 7 libtimidity.js:99:15
.Missing patch: arachno-47.pat libtimidity.js:99:15
Num Missing patches: 8 libtimidity.js:99:15
.Missing patch: MT32Drums/mt32drum-2.pat libtimidity.js:99:15
Num Missing patches: 9 libtimidity.js:99:15
.Missing patch: MT32Drums/mt32drum-3.pat libtimidity.js:99:15
Num Missing patches: 10 libtimidity.js:99:15
.Missing patch: MT32Drums/mt32drum-6.pat libtimidity.js:99:15
Num Missing patches: 11 libtimidity.js:99:15
.Missing patch: MT32Drums/mt32drum-7.pat libtimidity.js:99:15
Num Missing patches: 12 libtimidity.js:99:15
.Missing patch: MT32Drums/mt32drum-8.pat libtimidity.js:99:15
Num Missing patches: 13 libtimidity.js:99:15
.Missing patch: MT32Drums/mt32drum-11.pat libtimidity.js:99:15
Num Missing patches: 14 libtimidity.js:99:15
.Missing patch: MT32Drums/mt32drum-12.pat libtimidity.js:99:15
Num Missing patches: 15 libtimidity.js:99:15
.Missing patch: MT32Drums/mt32drum-14.pat libtimidity.js:99:15
Num Missing patches: 16 libtimidity.js:99:15
.Missing patch: MT32Drums/mt32drum-45.pat libtimidity.js:99:15
Num Missing patches: 17 libtimidity.js:99:15
.Missing patch: arachno-121.pat libtimidity.js:99:15
Num Missing patches: 0 libtimidity.js:99:15
.Missing patch: arachno-94.pat libtimidity.js:99:15
Num Missing patches: 1

@larsenv
Copy link
Contributor Author

larsenv commented Aug 3, 2019

I'm glad the pats are working now. I committed the replaced pats, as you can see.

Are you sure you recompiled the jar? I don't understand why a few of those pats are missing. Like instrument 127 isn't used anymore in the array, so it shouldn't be loading it.' A few of the original pats remain after I copy them over though. (119, 121, 122, 125 and 126).

I'm not sure what percussion numbers the drums map to, I didn't touch those, but they shouldn't be missing, just not working. I'm on vacation from this Saturday (tomorrow here) until Tuesday and won't have my laptop with me. Do you want to try using that tool to work with the percussion? It's not hard.

@Difegue
Copy link
Owner

Difegue commented Aug 3, 2019

I don't recompile the .jar currently, I'm just adding override string arrays in MidiServlet.

Libtimidity's errors are super vague tbh, I'm also on vacation starting monday for 2w (and voluntarily cutting off my github access save for comments), so I might push a commit with the injected array in a separate branch, and that's about it for the time being.

@Difegue
Copy link
Owner

Difegue commented Aug 3, 2019

Alright, some updates:

I fucked up my own instrument list when making that Excel file and most of your mappings were correct, so my deepest apologies about that.

I tried to work on percussions a bit but DIYEdit's export array is twice the length of the actual drumsets in the game, so I don't know how it's actually mapping them to midi. It's probably not 1-to-1 like the base instruments.

So instead, I switched the JS timidity implementation in DoujinSoft to a much newer one that actually works properly! It's in the diy-soundfont branch for now, alongside your fixed .pat files.
I've also pushed a build of that branch to the main website, so you can try out the sound for yourself. It's certainly closer than what we had before, but the 8-bit instruments are still all going to 80. 😅

I also updated the excel table with what's currently in the branch. I'll still occasionally tune in for comments 'n such during the next two weeks, but won't be able to do any dev work.

@larsenv
Copy link
Contributor Author

larsenv commented Aug 20, 2019

What do we need to do to get this merged into master? The drums shouldn't be hard to do if you give me the numbers associated with the drumConversion array.

I took a look at the 8-Bit stuff briefly using the WarioWare DIY Showcase BRSAR file, I could only find the Yoshi Boon-Boon sound.

Kind of worried about this, what should we do first?

@Difegue
Copy link
Owner

Difegue commented Aug 20, 2019

The weird thing about drums is that the arrays don't match at all in size:

DIY Midi Number
Normal Drums ACOUSTIC_BASS_DRUM 35
Electric Drums ACOUSTIC_SNARE 38
Samba Drums CLOSED_HI_HAT 42
Asian Drums OPEN_HI_HAT 46
Kitchen Drums CRASH_CYMBAL_1 49
Toy Drums LOW_FLOOR_TOM 41
BeatBox Drums HIGH_FLOOR_TOM 43
8bit Drums LOW_MID_TOM 47
  SIDE_STICK 37
  HAND_CLAP 39
  TAMBOURINE 54
  SHORT_GUIRO 73
  MUTE_TRIANGLE 80
  OPEN_TRIANGLE 81

Still worth trying to map 'em up though. I recommend you use the diy-soundfont branch I made as a base.

The 8bit instruments are much more important imo though as they're heavily used in a lot of records. It might be worth looking in the DS game instead of Showcase?

@larsenv
Copy link
Contributor Author

larsenv commented Aug 20, 2019

I didn't find all of the 8-Bit instruments because there's hundreds of samples in the game. Would you want to take a look if I told you how to do it?

I'm back in school, I still have some time but I did a good portion of the hard work with the soundfonts, help would be appreciated.

@Difegue
Copy link
Owner

Difegue commented Aug 21, 2019

I'm busy with a ton of other stuff as well sadly; It's fine if this is paused for a while tbh, it's not terribly important.

@larsenv
Copy link
Contributor Author

larsenv commented Aug 21, 2019

I can try to do it then.

@larsenv
Copy link
Contributor Author

larsenv commented Sep 12, 2019

Thanks to andrewk, I got the 8-Bit pat files. They're attached.
andrewk-BIT-pack.zip

The mappings:

  • Ding-Ding: 83
  • Pong-Pong: 84
  • Fah-Fah: 85
  • Bong-Bong: 86
  • Bing-Bing: 87
  • Ting-Ting: 88
  • Bling-Bling: 89
  • Boon-Boon: 90

Now to figure out the drum mappings... Are there any clues in the code to why there's so many drum instruments in the array?

@Difegue
Copy link
Owner

Difegue commented Sep 12, 2019

Alright! I've pushed the new samples to the diy-soundfont branch, will get a build up in a jiffy.

The code that handles the drum conversion is here, starting around line 192.

It seems to get 4 different drum values for the same block of data and then writes them sequentially? I really don't know much about how this part works.

The mapping array for reference:

Instrument Midi
Piano 0
Organ 18
Harpsichord 6
Melodica 22
Flute 73
Trumpet 56
Saxophone 65
Wood Flute 75
Acoustic Guitar 24
Electric Guitar 29
Banjo 106
Bass 33
Violin 40
Marimba 13
Vibraphone 11
Timpani 47
Star Drop 72
UFO 78
Alien 17
Robot 38
Rocket 77
Moon 59
Green Dude 126
Phone Dial 124
Cat 60
Dog 61
Pig 62
Insects 123
Frog 66
Yoshi 125
Birds 68
Monkeys 122
DoReMi Voice 53
Wah Dude 54
Opera Man 52
Soul Girl 49
Baby 67
Laughing Men 121
KungFu Men 119
Humming 48
DingDing 83
PongPong 84
FahFah 85
BongBong 86
BingBing 87
TingTing 88
BlingBling 89
BoonBoon 90

@larsenv
Copy link
Contributor Author

larsenv commented Sep 16, 2019

We got the percussion right, there's only 1 drumset that fits. The playback isn't perfect, but it's impressive.

Everything's merged into master, so I'm gonna close this.

@Difegue
Copy link
Owner

Difegue commented Sep 16, 2019

Thanks a bunch for all the work you've put into this.

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

Successfully merging this pull request may close these issues.

2 participants