Loopy Pro: Create music, your way.

What is Loopy Pro?Loopy Pro is a powerful, flexible, and intuitive live looper, sampler, clip launcher and DAW for iPhone and iPad. At its core, it allows you to record and layer sounds in real-time to create complex musical arrangements. But it doesn’t stop there—Loopy Pro offers advanced tools to customize your workflow, build dynamic performance setups, and create a seamless connection between instruments, effects, and external gear.

Use it for live looping, sequencing, arranging, mixing, and much more. Whether you're a live performer, a producer, or just experimenting with sound, Loopy Pro helps you take control of your creative process.

Download on the App Store

Loopy Pro is your all-in-one musical toolkit. Try it for free today.

[ Meow | Audio Editor ] Public Beta

13468917

Comments

  • @SevenSystems said:

    @skiphunt said:
    @SevenSystems I’m traveling at the moment, but had a little play with the beta on my iPhone - kinda liking it so far. The latest beta seems easier to grab the handles and the fader points.

    Good to hear, thanks!

    I haven’t read through this thread… curious if I can create a blank project then trim, fade and cut and paste to assemble edited pieces into the bank project?

    You can copy & paste between files, and also keep dragging and dropping stuff into the current file. However, I think what you're asking is probably support for opening multiple files at once and switching between them. That's not currently available or planned, but it would definitely be nice to have and completely trivial to implement, so I will add this to the roadmap.

    It all depends on if monthly proceeds from the app are higher than the usual 3.50 EUR 😃

    To be more precise… can I start new/blank audio project. Then, open a field recording and cut/copy then paste into my new/blank audio project file?

    Also, when you say monthly proceeds… are you talking about making this app subscription-based?!

  • tested the program on a iphone 6s with ios 15.8.1; works well no issues to report. however, it does not play on ios 7.3. loading, editing and processing seem to work it doesnt respond when pushing play.

  • @wag said:
    tested the program on a iphone 6s with ios 15.8.1; works well no issues to report. however, it does not play on ios 7.3. loading, editing and processing seem to work it doesnt respond when pushing play.

    Just tested on my 6s on 15.8.1 and the play button just shows a white square but the cursor isn’t moving.

    No biggie for me if iOS 15 isn’t supported as I have Twisted Wave but thought I’d let you know ;)

  • @SevenSystems This is not a 'bug' but I do feel it would be a good idea to disable further 'zooming out' if the whole file is already visible?

    This just looks a bit 'silly' :sunglasses:

  • The user and all related content has been deleted.
  • wimwim
    edited February 9

    I finally got around to some testing on iPhone 7, iOS 15.8.1. Two issues noticed so far:

    • No sound when the phone is set to silent mode with the side switch. Sound in other apps work fine with the switch on silent.

      • This problem occurs also on iPhone 13, iOS 17.3.1
    • Zooming in as far as possible I eventually get to a point where I can't zoom back out and don't seem to be able to scroll.

      • Tapping the Auto Zoom button twice zooms back to the selection. That's the only way I found to exit the stuck zoom and scroll.
      • This problem doesn't occur on iPhone 13, iOS 17.3.1
    • No usability problems even on the small screen. 😎

      • I know it's not standard, but it might be helpful to display the small scroll bar if any of the menu is hidden, to make it more obvious that there are off screen items.

    On a bright note, I opened another editor I was previously happy with and immediately was struck by the clutter and wanted to run back to Meow, at least until I need its additional functionality or use it as an AUv3 plugin.

  • edited February 9

    @wim said:

    On a bright note, I opened another editor I was previously happy with and immediately was struck by the clutter and wanted to run back to Meow, at least until I need its additional functionality or use it as an AUv3 plugin.

    This seems to happen every time devs feel compelled to add every single “must have” “dealbreaker” user request… either controls get so buried within menus that you can no longer remember where everything is… or, the app gets so bloated with clutter that it’s ultimately no longer fun to use and destined to be abandoned.

  • wimwim
    edited February 10

    @skiphunt said:

    @wim said:

    On a bright note, I opened another editor I was previously happy with and immediately was struck by the clutter and wanted to run back to Meow, at least until I need its additional functionality or use it as an AUv3 plugin.

    This seems to happen every time devs feel compelled to add every single “must have” “dealbreaker” user request… either controls get so buried within menus that you can no longer remember where everything is… or, the app gets so bloated with clutter that it’s ultimately no longer fun to use and destined to be abandoned.

    True, but sometimes those features are actually needed, so it's a good thing those more complex / powerful apps are available when you need them.

    Some people prefer to have more all-in-one tools so-as to not have to learn multiple apps but still have all their needs met. I'm not opposed to having more than one app available depending on the occasion.

    Meow looks to me to be heading toward the 80/20 rule. Maybe 60/40 for me right now, but still on the more frequently used side. Three features would push it above 80/20 for me, but I don't want to detract from your KISS** sentiment, which I don't disagree with. 😉

    (** Keep It Simple Stupid)

  • Thanks for all the amazing feedback everyone.

    I'm currently doing family business for a few days, but will be back shortly with a slew of fixes and several of your suggestions implemented. It'll be great when it's done. Thanks again for helping make Meow meow properly! 🐈

    @Samu said:

    @SevenSystems said:

    Thanks a lot, you're a great director 😄 so it occurs with drag-select... right...

    Yepp, and as long as I don't 'zoom' I can do multiple selections and use the UI with just the pencil (or mouse).

    I've tried with a USB-Mouse as well using 'Universal Control' where I can share the keyboard and pointing device between my Mac and the iPad.

    And I've also tested in both landscape and portrait modes and various 'window sizes' with StageManager.

    I don't have a Pencil but will try with Bluetooth mouse when back in the office.

    BT Mouse should behave the same as 'Universal Control' and 'USB Mouse'.

    EDIT: I guess the problem is the combination of using mouse AND touch input interchangeably.

    Could be but shouldn't be. Meow is the only app I have that has this behavior, most other apps either block the use of Apple Pencil or work as expected.

    Hopefully You'll figure out what causes it.

    Yes, I wasn't meaning to imply it wasn't a bug! Just thinking out loud to myself mostly :) both will work as expected shortly even when combined.

    @pedro said:

    @SevenSystems said:
    Thanks for the Screenshot. Yeah, I might try to adapt the UI when run on a very small screen by maybe removing the padding in the toolbars like in Xequence.

    Have you considered hiding the nudge and fade squares, and only show the brackets, unless one taps on the bracket (then it would show the other squares)?

    I haven't yet looked at small screen optimizations in much detail, but those are great suggestions.

    When dragging a bracket you could also hide all those elements (or make them transparent) and just show the selection cursor.

    A great suggestion as well. I will consider these, thanks!

    Also it is too easy (I suspect even on bigger phones) to be nudging and accidentally tapping outside the selection.

    Yes, it's good you bring it up. I've had the same problem and thought a good solution might be to instead of moving the handle when nudging, move the VIEW instead so the handle stays at the same spot (if you know what I mean). Deal?

    I know each one has their preferences, but maybe if there was a global setting that required double-tap to move the playhead outside the selection? I think it's frustrating to have made your perfect selection and losing it because of an accidental touch.

    You can use "Undo" to undo selection changes as well, not just processing!

    I would likely try to avoid double-tap for now if possible, as it brings discoverability problems. I'm a strong proponent of "visible explicit UI elements for all functions".

    Meanwhile, what you CAN do is go to the system settings, Display, Text Size and reduce that, it'll scale Meow. 🐈

    Yeah, I could, but then I wouldn't be able to use anything else on my phone :)
    Anyway, I must be the only one still using a 4" screen here, so don't waste time on that.

    Your suggestions make sense for bigger phones as well.

    @EdZAB said:
    Would anyone else prefer to have an alternative method to close an open "menu box", such as "Edit" without having to click on it a second time? For example, to just be able to tap on the blank area on the top between buttons and close it? I use Xequence and it behaves the same, but I guess I don't find myself popping in and out of the menu buttons as often, so it seemed fine there.

    This has been mentioned before and I mostly agree. I have it on my list! :)

    Overall: It took me a bit to figure out how to use the controls, but once I got the gist of how it works, I really liked the responsive and direct feel of it, and using the sliders for selection is actually quite helpful. I've found that selecting within the waveform in other audio editor apps can be very tricky, especially on a smaller screen where your finger actually gets in the way, or you have to hold and then drag, and it sometimes slides the waveform instead. The way the fade preview works is also very nice. Looking forward to testing it further. Looks promising.

    Thanks!

    Thank you for your feedback. And yes, the "handles" concept has been brought over from Xequence as it has been mostly well-received there.

    Regarding figuring out some of the basics: I'll add a simple in-app help system like Trinity has for these to help new users.

  • edited February 10

    @wim said:

    @skiphunt said:

    @wim said:

    On a bright note, I opened another editor I was previously happy with and immediately was struck by the clutter and wanted to run back to Meow, at least until I need its additional functionality or use it as an AUv3 plugin.

    This seems to happen every time devs feel compelled to add every single “must have” “dealbreaker” user request… either controls get so buried within menus that you can no longer remember where everything is… or, the app gets so bloated with clutter that it’s ultimately no longer fun to use and destined to be abandoned.

    True, but sometimes those features are actually needed, so it's a good thing those more complex / powerful apps are available when you need them.

    Some people prefer to have more all-in-one tools so-as to not have to learn multiple apps but still have all their needs met. I'm not opposed to having more than one app available depending on the occasion.

    Meow looks to me to be heading toward the 80/20 rule. Maybe 60/40 for me right now, but still on the more frequently used side. Three features would push it above 80/20 for me, but I don't want to detract from your KISS** sentiment, which I don't disagree with. 😉

    (** Keep it Simple Stupid)

    Oh, I agree. Some devs seem to have an added skill of being able to discern features that actually improve the app in a meaningful way, and can implement without destroying the UX.

    The Nodes dev seems to be skilled at this (so far) and Brambos as well. But I know you definitely get my drift :)

  • @skiphunt said:

    @SevenSystems said:

    @skiphunt said:
    @SevenSystems I’m traveling at the moment, but had a little play with the beta on my iPhone - kinda liking it so far. The latest beta seems easier to grab the handles and the fader points.

    Good to hear, thanks!

    I haven’t read through this thread… curious if I can create a blank project then trim, fade and cut and paste to assemble edited pieces into the bank project?

    You can copy & paste between files, and also keep dragging and dropping stuff into the current file. However, I think what you're asking is probably support for opening multiple files at once and switching between them. That's not currently available or planned, but it would definitely be nice to have and completely trivial to implement, so I will add this to the roadmap.

    It all depends on if monthly proceeds from the app are higher than the usual 3.50 EUR 😃

    To be more precise… can I start new/blank audio project. Then, open a field recording and cut/copy then paste into my new/blank audio project file?

    You can't currently create a new blank project, but that'll be possible soon! Then you'll be able to copy and paste between projects too.

    There will also be a simple but very quick internal recording feature, including Insert / Mix / Replace modes like "Paste" has.

    Also, when you say monthly proceeds… are you talking about making this app subscription-based?!

    😄 no, it won't be subscription, I like to own my stuff and know most of my users do too! I just tend to calculate everything (finances...) in monthly intervals, that's why the "monthly"...

    @wag said:
    tested the program on a iphone 6s with ios 15.8.1; works well no issues to report. however, it does not play on ios 7.3. loading, editing and processing seem to work it doesnt respond when pushing play.

    Thanks. You probably mean 17.3? Does the playhead move when you press play? If so, can you try unmuting your device (Mute switch)?

    @Samu said:
    @SevenSystems This is not a 'bug' but I do feel it would be a good idea to disable further 'zooming out' if the whole file is already visible?

    This just looks a bit 'silly' :sunglasses:

    Yes of course. No-brainer. It's obviously planned but it wasn't crucial for the first beta so I left it out. Same for zooming in of course. Who wants to edit half a sample frame 😄

    @tja said:

    @supadom said:

    @wag said:
    tested the program on a iphone 6s with ios 15.8.1; works well no issues to report. however, it does not play on ios 7.3. loading, editing and processing seem to work it doesnt respond when pushing play.

    Just tested on my 6s on 15.8.1 and the play button just shows a white square but the cursor isn’t moving.

    No biggie for me if iOS 15 isn’t supported as I have Twisted Wave but thought I’d let you know ;)

    @SevenSystems On my iPhone 6s with 15.8.1 it looks quote fine:

    But I needed to send the screenshot by Telegram chat from iPhone to iPad to write this, iCloud just did not show it on the iPad!

    The iPhone said that the file was there, but apparently it got not uploaded...

    Thank you for testing! And I know why I don't use any of that magical cloud stuff 😄

    @wim said:
    I finally got around to some testing on iPhone 7, iOS 15.8.1. Two issues noticed so far:

    • No sound when the phone is set to silent mode with the side switch. Sound in other apps work fine with the switch on silent.

    Known issue, on the list, thanks!

    • Zooming in as far as possible I eventually get to a point where I can't zoom back out and don't seem to be able to scroll.

    Thank you, yes, limiting the zoom both for in and out will be in the next update. I know it's a silly omission but it isn't crucial for testing so I left it out in the first beta 😄

    • No usability problems even on the small screen. 😎

    That is great to hear. I do plan on some optimizations for small screens still though, also some good suggestions here.

    • I know it's not standard, but it might be helpful to display the small scroll bar if any of the menu is hidden, to make it more obvious that there are off screen items.

    Yes, I'd actually like that for all apps that are based on the Xequence toolkit. Hopefully get around to it soon! I'm a discoverability junkie so this is definitely on my wanted list.

    On a bright note, I opened another editor I was previously happy with and immediately was struck by the clutter and wanted to run back to Meow

    That's really nice to hear, as I put huge value in UI / UX and I'm happy when it works out.

  • edited February 10

    i vote for above mentioned change of bottom selection left / right icons to jump to selection point (center it to the screen with preserved zoom) by tap on them :-)

    other than that good good job ! feels smooth..

    sugested festure: set loop poins by selection and then save loop points into wav file - with this it may replace for me NS built in audio editor 🤝

  • edited February 10

    @dendy said:
    i vote for above mentioned change of bottom selection left / right icons to jump to selection point (center it to the screen with preserved zoom) by tap on them :-)

    other than that good good job ! feels smooth..

    sugested festure: set loop poins by selection and then save loop points into wav file - with this it may replace for me NS built in audio editor 🤝

    +1

    One loop is set for a file the selection could snap to the loop points/markers making it easy to delete content after the ‘loop’ ends and retain the content before the loop. (In short if the sample contains a loop-point the trim/crop function should trim from loop-end to sample end).

    I still use BM3 to sample most of my instrument samples unless I’m on the desktop using Renoise, SunVox or Logic which all support embedding loop-metadata to saved .wav files.

  • This is turning out rather perfect for lazy Saturday feet up random sample chopping…

  • @dendy said:
    i vote for above mentioned change of bottom selection left / right icons to jump to selection point (center it to the screen with preserved zoom) by tap on them :-)

    Yes, will do! :)

    other than that good good job ! feels smooth..

    Thanks, I appreciate it 🍻

    sugested festure: set loop poins by selection and then save loop points into wav file - with this it may replace for me NS built in audio editor 🤝

    Has been requested before, yes... I researched and most information I found stated that there is no standard way to embed loop point metadata in a WAV file / chunk / whatever.

    If anyone could point me at a source describing a way to embed loop points that is recognized by the majority of audio software, I'd be all in!

  • @Samu said:

    @dendy said:
    i vote for above mentioned change of bottom selection left / right icons to jump to selection point (center it to the screen with preserved zoom) by tap on them :-)

    other than that good good job ! feels smooth..

    sugested festure: set loop poins by selection and then save loop points into wav file - with this it may replace for me NS built in audio editor 🤝

    +1

    One loop is set for a file the selection could snap to the loop points/markers making it easy to delete content after the ‘loop’ ends and retain the content before the loop. (In short if the sample contains a loop-point the trim/crop function should trim from loop-end to sample end).

    But aren't there also samplers etc. which can loop while the note is on, but then continue playing the portion of the sample after the loop in the release phase? Then one might not want to remove the portion after the loop. So it would probably have to be optional. It would need a good UI.

  • edited February 12

    @Krupa said:
    This is turning out rather perfect for lazy Saturday feet up random sample chopping…

    Sounds brilliant! :)

    BTW, I've caught a bug of a respiratory kind myself, so discussion / updates might unfortunately be less frequent for a time. I guess my own biological "public beta" has long expired at 44 years...

  • @SevenSystems said:

    @Krupa said:
    This is turning out rather perfect for lazy Saturday feet up random sample chopping…

    Sounds brilliant! :)

    BTW, I've caught a bug of a respiratory kind myself, so discussion / updates might unfortunately be less frequent for a time. I guess my own biological "public beta" has long expired at 44 years...

    Eesh take care of that, this 48 year old is still having the odd coughing splutter more than a month after the first week of fever from some sort of flu…

  • @SevenSystems said:

    But aren't there also samplers etc. which can loop while the note is on, but then continue playing the portion of the sample after the loop in the release phase? Then one might not want to remove the portion after the loop. So it would probably have to be optional. It would need a good UI.

    There might be some but those are very rare on iOS so yes, it should be optional.

    This is probably the most flexible .wav looper I’ve ever bumped into.
    https://www.bjoernbojahr.de/endlesswav.html

    I know enough German to know what’s going on, some might need to use Google translate…

  • @SevenSystems said:

    @Samu said:

    @dendy said:
    i vote for above mentioned change of bottom selection left / right icons to jump to selection point (center it to the screen with preserved zoom) by tap on them :-)

    other than that good good job ! feels smooth..

    sugested festure: set loop poins by selection and then save loop points into wav file - with this it may replace for me NS built in audio editor 🤝

    +1

    One loop is set for a file the selection could snap to the loop points/markers making it easy to delete content after the ‘loop’ ends and retain the content before the loop. (In short if the sample contains a loop-point the trim/crop function should trim from loop-end to sample end).

    But aren't there also samplers etc. which can loop while the note is on, but then continue playing the portion of the sample after the loop in the release phase? Then one might not want to remove the portion after the loop. So it would probably have to be optional. It would need a good UI.

    yeah definitie do not removal of anything automatically .. just posibiliy to save loop into wav based on selection ..

  • @SevenSystems said:
    If anyone could point me at a source describing a way to embed loop points that is recognized by the majority of audio software, I'd be all in!

    Would ChatGPT assistance be relevant here?

    Certainly! The SMPL chunk in the WAV file format can be used to store loop information. It is a non-standard extension to the WAV format but is supported by some software.

    Here's a simple example in C++ using the WaveFile library:

    #include <iostream>
    #include <fstream>
    #include <cstdint>
    #include <cstring>
    
    #pragma pack(push, 1)  // Pack the struct without any padding
    struct SMPLChunk {
        char chunkID[4];
        uint32_t chunkSize;
        uint32_t manufacturer;
        uint32_t product;
        uint32_t samplePeriod;
        uint32_t MIDIUnityNote;
        uint32_t MIDIPitchFraction;
        uint32_t SMPTEFormat;
        uint32_t SMPTEOffset;
        uint32_t numSampleLoops;
        uint32_t samplerData;
    };
    
    struct SampleLoop {
        uint32_t cuePointID;
        uint32_t type;
        uint32_t start;
        uint32_t end;
        uint32_t fraction;
        uint32_t playCount;
    };
    #pragma pack(pop)
    
    void writeWAVWithLoop(const char* inputFileName, const char* outputFileName, uint32_t loopStart, uint32_t loopEnd) {
        std::ifstream inFile(inputFileName, std::ios::binary);
        if (!inFile) {
            std::cerr << "Error opening input file: " << inputFileName << std::endl;
            return;
        }
    
        std::ofstream outFile(outputFileName, std::ios::binary);
        if (!outFile) {
            std::cerr << "Error opening output file: " << outputFileName << std::endl;
            return;
        }
    
        // Read and copy the WAV header
        const int headerSize = 44;
        char header[headerSize];
        inFile.read(header, headerSize);
        outFile.write(header, headerSize);
    
        // Create and write the SMPL chunk
        SMPLChunk smplChunk;
        std::memset(&smplChunk, 0, sizeof(smplChunk));
        std::memcpy(smplChunk.chunkID, "smpl", 4);
        smplChunk.chunkSize = sizeof(SMPLChunk) - 8;  // Size of SMPLChunk excluding ID and size fields
        smplChunk.numSampleLoops = 1;
    
        SampleLoop sampleLoop;
        std::memset(&sampleLoop, 0, sizeof(sampleLoop));
        sampleLoop.cuePointID = 1;  // Can be any non-zero value
        sampleLoop.type = 0;        // Loop forward
        sampleLoop.start = loopStart;
        sampleLoop.end = loopEnd;
        smplChunk.samplerData = sizeof(SMPLChunk) + sizeof(SampleLoop) - 8;  // Offset to the SampleLoop data
    
        outFile.write(reinterpret_cast<const char*>(&smplChunk), sizeof(smplChunk));
        outFile.write(reinterpret_cast<const char*>(&sampleLoop), sizeof(sampleLoop));
    
        // Copy the rest of the input file
        outFile << inFile.rdbuf();
    
        std::cout << "WAV file with loop region written to: " << outputFileName << std::endl;
    }
    
    int main() {
        const char* inputFileName = "sound.wav";
        const char* outputFileName = "sound_with_loop.wav";
        uint32_t loopStart = 44100;  // Start of loop region in samples
        uint32_t loopEnd = 88200;    // End of loop region in samples
    
        writeWAVWithLoop(inputFileName, outputFileName, loopStart, loopEnd);
    
        return 0;
    }
    

    This code assumes that the input WAV file has a standard 44-byte header. The loop region is specified in samples, and you can adjust the loopStart and loopEnd variables accordingly. Note that the loop information might not be recognized by all software, as this is not a standard feature of the WAV format.

  • edited February 13

    @bleep said:

    @SevenSystems said:
    If anyone could point me at a source describing a way to embed loop points that is recognized by the majority of audio software, I'd be all in!

    Would ChatGPT assistance be relevant here?

    Certainly! The SMPL chunk in the WAV file format can be used to store loop information. It is a non-standard extension to the WAV format but is supported by some software.

    Here's a simple example in C++ using the WaveFile library:

    #include <iostream>
    #include <fstream>
    #include <cstdint>
    #include <cstring>
    
    #pragma pack(push, 1)  // Pack the struct without any padding
    struct SMPLChunk {
        char chunkID[4];
        uint32_t chunkSize;
        uint32_t manufacturer;
        uint32_t product;
        uint32_t samplePeriod;
        uint32_t MIDIUnityNote;
        uint32_t MIDIPitchFraction;
        uint32_t SMPTEFormat;
        uint32_t SMPTEOffset;
        uint32_t numSampleLoops;
        uint32_t samplerData;
    };
    
    struct SampleLoop {
        uint32_t cuePointID;
        uint32_t type;
        uint32_t start;
        uint32_t end;
        uint32_t fraction;
        uint32_t playCount;
    };
    #pragma pack(pop)
    
    void writeWAVWithLoop(const char* inputFileName, const char* outputFileName, uint32_t loopStart, uint32_t loopEnd) {
        std::ifstream inFile(inputFileName, std::ios::binary);
        if (!inFile) {
            std::cerr << "Error opening input file: " << inputFileName << std::endl;
            return;
        }
    
        std::ofstream outFile(outputFileName, std::ios::binary);
        if (!outFile) {
            std::cerr << "Error opening output file: " << outputFileName << std::endl;
            return;
        }
    
        // Read and copy the WAV header
        const int headerSize = 44;
        char header[headerSize];
        inFile.read(header, headerSize);
        outFile.write(header, headerSize);
    
        // Create and write the SMPL chunk
        SMPLChunk smplChunk;
        std::memset(&smplChunk, 0, sizeof(smplChunk));
        std::memcpy(smplChunk.chunkID, "smpl", 4);
        smplChunk.chunkSize = sizeof(SMPLChunk) - 8;  // Size of SMPLChunk excluding ID and size fields
        smplChunk.numSampleLoops = 1;
    
        SampleLoop sampleLoop;
        std::memset(&sampleLoop, 0, sizeof(sampleLoop));
        sampleLoop.cuePointID = 1;  // Can be any non-zero value
        sampleLoop.type = 0;        // Loop forward
        sampleLoop.start = loopStart;
        sampleLoop.end = loopEnd;
        smplChunk.samplerData = sizeof(SMPLChunk) + sizeof(SampleLoop) - 8;  // Offset to the SampleLoop data
    
        outFile.write(reinterpret_cast<const char*>(&smplChunk), sizeof(smplChunk));
        outFile.write(reinterpret_cast<const char*>(&sampleLoop), sizeof(sampleLoop));
    
        // Copy the rest of the input file
        outFile << inFile.rdbuf();
    
        std::cout << "WAV file with loop region written to: " << outputFileName << std::endl;
    }
    
    int main() {
        const char* inputFileName = "sound.wav";
        const char* outputFileName = "sound_with_loop.wav";
        uint32_t loopStart = 44100;  // Start of loop region in samples
        uint32_t loopEnd = 88200;    // End of loop region in samples
    
        writeWAVWithLoop(inputFileName, outputFileName, loopStart, loopEnd);
    
        return 0;
    }
    

    This code assumes that the input WAV file has a standard 44-byte header. The loop region is specified in samples, and you can adjust the loopStart and loopEnd variables accordingly. Note that the loop information might not be recognized by all software, as this is not a standard feature of the WAV format.

    Most iOS apps that handle loop-points I've tried so far support the 'smpl' chunk, BM3, BM2, NS2, Drambo, QuickSampler in LogicPro for iPad, GarageBand's Sampler, AudioLayer, SunVox and a few other betas I'm testing to name a few...

  • @Samu said:

    @SevenSystems said:

    But aren't there also samplers etc. which can loop while the note is on, but then continue playing the portion of the sample after the loop in the release phase? Then one might not want to remove the portion after the loop. So it would probably have to be optional. It would need a good UI.

    There might be some but those are very rare on iOS so yes, it should be optional.

    This is probably the most flexible .wav looper I’ve ever bumped into.
    https://www.bjoernbojahr.de/endlesswav.html

    I know enough German to know what’s going on, some might need to use Google translate…

    No problem with the German, I am German 😃 yes that seems to be pretty comprehensive (although it could maybe use some make-up...)... Meow is not intended to be a specialized tool for looping samples, so I probably won't be adding all these features, but saving loop points is definitely on the agenda!

  • @bleep said:

    @SevenSystems said:
    If anyone could point me at a source describing a way to embed loop points that is recognized by the majority of audio software, I'd be all in!

    Would ChatGPT assistance be relevant here?

    Certainly! The SMPL chunk in the WAV file format can be used to store loop information. It is a non-standard extension to the WAV format but is supported by some software.

    Here's a simple example in C++ using the WaveFile library:

    #include <iostream>
    #include <fstream>
    #include <cstdint>
    #include <cstring>
    
    #pragma pack(push, 1)  // Pack the struct without any padding
    struct SMPLChunk {
        char chunkID[4];
        uint32_t chunkSize;
        uint32_t manufacturer;
        uint32_t product;
        uint32_t samplePeriod;
        uint32_t MIDIUnityNote;
        uint32_t MIDIPitchFraction;
        uint32_t SMPTEFormat;
        uint32_t SMPTEOffset;
        uint32_t numSampleLoops;
        uint32_t samplerData;
    };
    
    struct SampleLoop {
        uint32_t cuePointID;
        uint32_t type;
        uint32_t start;
        uint32_t end;
        uint32_t fraction;
        uint32_t playCount;
    };
    #pragma pack(pop)
    
    void writeWAVWithLoop(const char* inputFileName, const char* outputFileName, uint32_t loopStart, uint32_t loopEnd) {
        std::ifstream inFile(inputFileName, std::ios::binary);
        if (!inFile) {
            std::cerr << "Error opening input file: " << inputFileName << std::endl;
            return;
        }
    
        std::ofstream outFile(outputFileName, std::ios::binary);
        if (!outFile) {
            std::cerr << "Error opening output file: " << outputFileName << std::endl;
            return;
        }
    
        // Read and copy the WAV header
        const int headerSize = 44;
        char header[headerSize];
        inFile.read(header, headerSize);
        outFile.write(header, headerSize);
    
        // Create and write the SMPL chunk
        SMPLChunk smplChunk;
        std::memset(&smplChunk, 0, sizeof(smplChunk));
        std::memcpy(smplChunk.chunkID, "smpl", 4);
        smplChunk.chunkSize = sizeof(SMPLChunk) - 8;  // Size of SMPLChunk excluding ID and size fields
        smplChunk.numSampleLoops = 1;
    
        SampleLoop sampleLoop;
        std::memset(&sampleLoop, 0, sizeof(sampleLoop));
        sampleLoop.cuePointID = 1;  // Can be any non-zero value
        sampleLoop.type = 0;        // Loop forward
        sampleLoop.start = loopStart;
        sampleLoop.end = loopEnd;
        smplChunk.samplerData = sizeof(SMPLChunk) + sizeof(SampleLoop) - 8;  // Offset to the SampleLoop data
    
        outFile.write(reinterpret_cast<const char*>(&smplChunk), sizeof(smplChunk));
        outFile.write(reinterpret_cast<const char*>(&sampleLoop), sizeof(sampleLoop));
    
        // Copy the rest of the input file
        outFile << inFile.rdbuf();
    
        std::cout << "WAV file with loop region written to: " << outputFileName << std::endl;
    }
    
    int main() {
        const char* inputFileName = "sound.wav";
        const char* outputFileName = "sound_with_loop.wav";
        uint32_t loopStart = 44100;  // Start of loop region in samples
        uint32_t loopEnd = 88200;    // End of loop region in samples
    
        writeWAVWithLoop(inputFileName, outputFileName, loopStart, loopEnd);
    
        return 0;
    }
    

    This code assumes that the input WAV file has a standard 44-byte header. The loop region is specified in samples, and you can adjust the loopStart and loopEnd variables accordingly. Note that the loop information might not be recognized by all software, as this is not a standard feature of the WAV format.

    Thanks, I had actually asked GPT, and "he" came back with the fact that there is no agreed-upon standard for this. But now that I know that this non-standard chunk is supported by the majority of software, I'll definitely look into it!

  • @Samu said:

    @bleep said:

    @SevenSystems said:
    If anyone could point me at a source describing a way to embed loop points that is recognized by the majority of audio software, I'd be all in!

    Would ChatGPT assistance be relevant here?

    Certainly! The SMPL chunk in the WAV file format can be used to store loop information. It is a non-standard extension to the WAV format but is supported by some software.

    Here's a simple example in C++ using the WaveFile library:

    #include <iostream>
    #include <fstream>
    #include <cstdint>
    #include <cstring>
    
    #pragma pack(push, 1)  // Pack the struct without any padding
    struct SMPLChunk {
        char chunkID[4];
        uint32_t chunkSize;
        uint32_t manufacturer;
        uint32_t product;
        uint32_t samplePeriod;
        uint32_t MIDIUnityNote;
        uint32_t MIDIPitchFraction;
        uint32_t SMPTEFormat;
        uint32_t SMPTEOffset;
        uint32_t numSampleLoops;
        uint32_t samplerData;
    };
    
    struct SampleLoop {
        uint32_t cuePointID;
        uint32_t type;
        uint32_t start;
        uint32_t end;
        uint32_t fraction;
        uint32_t playCount;
    };
    #pragma pack(pop)
    
    void writeWAVWithLoop(const char* inputFileName, const char* outputFileName, uint32_t loopStart, uint32_t loopEnd) {
        std::ifstream inFile(inputFileName, std::ios::binary);
        if (!inFile) {
            std::cerr << "Error opening input file: " << inputFileName << std::endl;
            return;
        }
    
        std::ofstream outFile(outputFileName, std::ios::binary);
        if (!outFile) {
            std::cerr << "Error opening output file: " << outputFileName << std::endl;
            return;
        }
    
        // Read and copy the WAV header
        const int headerSize = 44;
        char header[headerSize];
        inFile.read(header, headerSize);
        outFile.write(header, headerSize);
    
        // Create and write the SMPL chunk
        SMPLChunk smplChunk;
        std::memset(&smplChunk, 0, sizeof(smplChunk));
        std::memcpy(smplChunk.chunkID, "smpl", 4);
        smplChunk.chunkSize = sizeof(SMPLChunk) - 8;  // Size of SMPLChunk excluding ID and size fields
        smplChunk.numSampleLoops = 1;
    
        SampleLoop sampleLoop;
        std::memset(&sampleLoop, 0, sizeof(sampleLoop));
        sampleLoop.cuePointID = 1;  // Can be any non-zero value
        sampleLoop.type = 0;        // Loop forward
        sampleLoop.start = loopStart;
        sampleLoop.end = loopEnd;
        smplChunk.samplerData = sizeof(SMPLChunk) + sizeof(SampleLoop) - 8;  // Offset to the SampleLoop data
    
        outFile.write(reinterpret_cast<const char*>(&smplChunk), sizeof(smplChunk));
        outFile.write(reinterpret_cast<const char*>(&sampleLoop), sizeof(sampleLoop));
    
        // Copy the rest of the input file
        outFile << inFile.rdbuf();
    
        std::cout << "WAV file with loop region written to: " << outputFileName << std::endl;
    }
    
    int main() {
        const char* inputFileName = "sound.wav";
        const char* outputFileName = "sound_with_loop.wav";
        uint32_t loopStart = 44100;  // Start of loop region in samples
        uint32_t loopEnd = 88200;    // End of loop region in samples
    
        writeWAVWithLoop(inputFileName, outputFileName, loopStart, loopEnd);
    
        return 0;
    }
    

    This code assumes that the input WAV file has a standard 44-byte header. The loop region is specified in samples, and you can adjust the loopStart and loopEnd variables accordingly. Note that the loop information might not be recognized by all software, as this is not a standard feature of the WAV format.

    Most iOS apps that handle loop-points I've tried so far support the 'smpl' chunk, BM3, BM2, NS2, Drambo, QuickSampler in LogicPro for iPad, GarageBand's Sampler, AudioLayer, SunVox and a few other betas I'm testing to name a few...

    Brilliant, thanks for confirming, what I needed was a list of software that actually agrees on the same "non-standard" 😄

  • Latest beta
    iPhone 14 plus
    Can’t see the the sample
    All brackets etc not visible
    Seem to be squashed in 1 corner. Sample will play but can’t see or edit

  • @Gdub said:
    Latest beta
    iPhone 14 plus
    Can’t see the the sample
    All brackets etc not visible
    Seem to be squashed in 1 corner. Sample will play but can’t see or edit

    Same here on iPad 2020 with latest iPadOS. This is how the UI looks with a file open:

  • @branis
    Snap
    Same here

  • Oh man! SORRY! Please delete the installed beta and then reinstall from TestFlight, this will fix the issue until I'll upload a compatibility fix later today!

  • @SevenSystems said:
    Oh man! SORRY! Please delete the installed beta and then reinstall from TestFlight, this will fix the issue until I'll upload a compatibility fix later today!

    Did that and...
    ...just in case you're interested, trying to do a selection using apple-pencil or mouse once cases 'insta crash'.
    I get the error box with the thing with the red quit button.

Sign In or Register to comment.